Skip to content

Commit e21cd02

Browse files
committed
Add IOIntConsumer
1 parent 152e4f1 commit e21cd02

File tree

6 files changed

+183
-0
lines changed

6 files changed

+183
-0
lines changed

src/changes/changes.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ The <action> type attribute can be add,update,fix,remove.
6464
<action dev="ggregory" type="add" due-to="Gary Gregory">Add ValidatingObjectInputStream.ObjectStreamClassPredicate to allow configuration reuse.</action>
6565
<action dev="ggregory" type="add" due-to="Gary Gregory">Add RandomAccessFileMode.accept(Path, IOConsumer&lt;RandomAccessFile&gt;).</action>
6666
<action dev="ggregory" type="add" due-to="Gary Gregory">Add RandomAccessFileMode.apply(Path, IOFunction&lt;RandomAccessFile&gt;, T).</action>
67+
<action dev="ggregory" type="add" due-to="Gary Gregory">Add IOIntConsumer.</action>
6768
<!-- UPDATE -->
6869
<action dev="ggregory" type="update" due-to="Gary Gregory">Bump org.apache.commons:commons-parent from 74 to 78 #670, #676, #679, #688.</action>
6970
<action dev="ggregory" type="update" due-to="Gary Gregory">Bump commons.bytebuddy.version from 1.15.1 to 1.15.8 #672, #673, #685, #686, #694, #696.</action>
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
/*
2+
* Licensed to the Apache Software Foundation (ASF) under one or more
3+
* contributor license agreements. See the NOTICE file distributed with
4+
* this work for additional information regarding copyright ownership.
5+
* The ASF licenses this file to You under the Apache License, Version 2.0
6+
* (the "License"); you may not use this file except in compliance with
7+
* the License. You may obtain a copy of the License at
8+
*
9+
* http://www.apache.org/licenses/LICENSE-2.0
10+
*
11+
* Unless required by applicable law or agreed to in writing, software
12+
* distributed under the License is distributed on an "AS IS" BASIS,
13+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
* See the License for the specific language governing permissions and
15+
* limitations under the License.
16+
*/
17+
18+
package org.apache.commons.io.function;
19+
20+
import java.io.IOException;
21+
import java.io.UncheckedIOException;
22+
import java.util.Objects;
23+
import java.util.function.Consumer;
24+
import java.util.function.IntConsumer;
25+
26+
/**
27+
* Like {@link IntConsumer} but throws {@link IOException}.
28+
*
29+
* @since 2.18.0
30+
*/
31+
@FunctionalInterface
32+
public interface IOIntConsumer {
33+
34+
/**
35+
* The constant no-op consumer.
36+
*/
37+
IOIntConsumer NOOP = i -> {/* noop */};
38+
39+
/**
40+
* Performs this operation on the given argument.
41+
*
42+
* @param value the input argument
43+
* @throws IOException if an I/O error occurs.
44+
*/
45+
void accept(int value) throws IOException;
46+
47+
/**
48+
* Returns a composed {@code IOIntConsumer} that performs, in sequence, this operation followed by the {@code after} operation. If performing either
49+
* operation throws an exception, it is relayed to the caller of the composed operation. If performing this operation throws an exception, the {@code after}
50+
* operation will not be performed.
51+
*
52+
* @param after the operation to perform after this operation
53+
* @return a composed {@code IOIntConsumer} that performs in sequence this operation followed by the {@code after} operation
54+
* @throws NullPointerException if {@code after} is null
55+
*/
56+
default IOIntConsumer andThen(final IOIntConsumer after) {
57+
Objects.requireNonNull(after);
58+
return (final int i) -> {
59+
accept(i);
60+
after.accept(i);
61+
};
62+
}
63+
64+
/**
65+
* Creates a {@link Consumer} for this instance that throws {@link UncheckedIOException} instead of {@link IOException}.
66+
*
67+
* @return an UncheckedIOException IntConsumer.
68+
*/
69+
default Consumer<Integer> asConsumer() {
70+
return i -> Uncheck.accept(this, i);
71+
}
72+
73+
/**
74+
* Creates an {@link IntConsumer} for this instance that throws {@link UncheckedIOException} instead of {@link IOException}.
75+
*
76+
* @return an UncheckedIOException IntConsumer.
77+
*/
78+
default IntConsumer asIntConsumer() {
79+
return i -> Uncheck.accept(this, i);
80+
}
81+
82+
}

src/main/java/org/apache/commons/io/function/Uncheck.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,22 @@ public static <T> void accept(final IOConsumer<T> consumer, final T t) {
6262
}
6363
}
6464

65+
/**
66+
* Accepts an IO consumer with the given argument.
67+
*
68+
* @param i the input argument.
69+
* @param consumer Consumes the value.
70+
* @throws UncheckedIOException if an I/O error occurs.
71+
* @since 2.18.0
72+
*/
73+
public static void accept(final IOIntConsumer consumer, final int i) {
74+
try {
75+
consumer.accept(i);
76+
} catch (final IOException e) {
77+
throw wrap(e);
78+
}
79+
}
80+
6581
/**
6682
* Accepts an IO consumer with the given arguments.
6783
*
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
/*
2+
* Licensed to the Apache Software Foundation (ASF) under one or more
3+
* contributor license agreements. See the NOTICE file distributed with
4+
* this work for additional information regarding copyright ownership.
5+
* The ASF licenses this file to You under the Apache License, Version 2.0
6+
* (the "License"); you may not use this file except in compliance with
7+
* the License. You may obtain a copy of the License at
8+
*
9+
* http://www.apache.org/licenses/LICENSE-2.0
10+
*
11+
* Unless required by applicable law or agreed to in writing, software
12+
* distributed under the License is distributed on an "AS IS" BASIS,
13+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
* See the License for the specific language governing permissions and
15+
* limitations under the License.
16+
*/
17+
18+
package org.apache.commons.io.function;
19+
20+
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
21+
import static org.junit.jupiter.api.Assertions.assertEquals;
22+
import static org.junit.jupiter.api.Assertions.assertThrows;
23+
24+
import java.io.IOException;
25+
import java.io.UncheckedIOException;
26+
import java.util.Optional;
27+
import java.util.concurrent.atomic.AtomicReference;
28+
29+
import org.junit.jupiter.api.Test;
30+
31+
/**
32+
* Tests {@link IOIntConsumer}.
33+
*/
34+
public class IOIntConsumerTest {
35+
36+
@Test
37+
void testAccept() throws IOException {
38+
assertDoesNotThrow(() -> IOIntConsumer.NOOP.accept(0));
39+
assertDoesNotThrow(() -> IOIntConsumer.NOOP.accept('.'));
40+
final AtomicReference<String> ref = new AtomicReference<>();
41+
final IOIntConsumer consumer = s -> ref.set(s + "-");
42+
consumer.accept(65);
43+
assertEquals(65 + "-", ref.get());
44+
}
45+
46+
@Test
47+
void testAndThen() throws IOException {
48+
final AtomicReference<String> ref = new AtomicReference<>();
49+
final IOIntConsumer consumer1 = s -> ref.set(s + "-");
50+
final IOIntConsumer consumer2 = s -> ref.set(ref.get() + "=" + s);
51+
consumer1.andThen(consumer2).accept(66);
52+
assertEquals(66 + "-=" + 66, ref.get());
53+
}
54+
55+
@Test
56+
void testAsConsumer() {
57+
assertThrows(UncheckedIOException.class, () -> Optional.of(65).ifPresent(TestUtils.throwingIOIntConsumer().asConsumer()));
58+
final AtomicReference<String> ref = new AtomicReference<>();
59+
final IOIntConsumer consumer1 = s -> ref.set(s + "A");
60+
Optional.of(2).ifPresent(consumer1.asConsumer());
61+
assertEquals("2A", ref.get());
62+
}
63+
64+
@Test
65+
void testasIntConsumer() {
66+
final AtomicReference<String> ref = new AtomicReference<>();
67+
final IOIntConsumer consumer1 = s -> ref.set(s + "A");
68+
consumer1.asIntConsumer().accept(2);
69+
assertEquals("2A", ref.get());
70+
}
71+
72+
@Test
73+
void testNOOP() {
74+
// nothing happens:
75+
assertDoesNotThrow(() -> IOIntConsumer.NOOP.accept(0));
76+
}
77+
78+
}

src/test/java/org/apache/commons/io/function/TestConstants.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ final class TestConstants {
4242

4343
static IOConsumer<Object> THROWING_IO_CONSUMER = t -> throwIOException();
4444

45+
static IOIntConsumer THROWING_IO_INT_CONSUMER = t -> throwIOException();
46+
4547
static IOFunction<Object, Object> THROWING_IO_FUNCTION = t -> throwIOException();
4648

4749
static IOIntSupplier THROWING_IO_INT_SUPPLIER = TestConstants::throwIOException;

src/test/java/org/apache/commons/io/function/TestUtils.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,10 @@ static <T, U> IOFunction<T, U> throwingIOFunction() {
9494
return (IOFunction<T, U>) TestConstants.THROWING_IO_FUNCTION;
9595
}
9696

97+
static IOIntConsumer throwingIOIntConsumer() {
98+
return TestConstants.THROWING_IO_INT_CONSUMER;
99+
}
100+
97101
@SuppressWarnings("unchecked")
98102
static <T> IOPredicate<T> throwingIOPredicate() {
99103
return (IOPredicate<T>) TestConstants.THROWING_IO_PREDICATE;

0 commit comments

Comments
 (0)