A collection of Functional helpers
From 1 to 10 fields
import es.rubenjgarcia.commons.functional.tuple.*;
import static es.rubenjgarcia.commons.functional.tuple.Tuple.tuple;
Tuple2 t2 = tuple("1", "2");
t2.toString(); // (1, 2)
t2.equals(tuple("1", "2")); // true
Returns a list of Tuple2 formed from two streams by combining corresponding elements in pairs. If one of the two collections is longer than the other, its remaining elements are ignored.
import static es.rubenjgarcia.commons.functional.StreamUtils.zip;
List<Integer> ints = Arrays.asList(1, 2, 3);
List<String> strings = Arrays.asList("a", "b", "c");
List<Tuple2<Integer, String>> tuples = zip(ints.stream(), strings.stream()).collect(Collectors.toList());
tuples.toString(); // [(1, a), (2, b), (3, c)]
import static es.rubenjgarcia.commons.functional.StreamUtils.zipWithIndex;
List<String> strings = Arrays.asList("1", "2", "3");
List<Tuple2<Long, String>> tuples = zipWithIndex(strings.stream()).collect(Collectors.toList());
Converts a collection of Tuple2 into a Tuple2 of stream of the first and second half of each pair
import es.rubenjgarcia.commons.functional.tuple.*;
import static es.rubenjgarcia.commons.functional.StreamUtils.unzip;
Tuple2<Stream<Integer>, Stream<String>> tupleStream = unzip(tuples);
List<Integer> ints = tupleStream._1.collect(Collectors.toList());
List<String> strings = tupleStream._2.collect(Collectors.toList());
Return if the value matches any predicate
import static es.rubenjgarcia.commons.functional.FunctionalFilters.anyOf;
Predicate<Integer> p = anyOf(n -> n == 1, n -> n == 2);
p.test(1); // true
p.test(3); // false
Return if the value doesn't match any of the predicates
import static es.rubenjgarcia.commons.functional.FunctionalFilters.noneOf;
Predicate<Integer> p = noneOf(n -> n == 1, n -> n == 2);
p.test(1); // false
p.test(3); // true
Return if the value matches all the predicates
import static es.rubenjgarcia.commons.functional.FunctionalFilters.allOf;
Predicate<Integer> p = allOf(n -> n > 1, n -> n < 3);
p.test(1); // false
p.test(2); // true
Find the first element that matchs the predicate
import static es.rubenjgarcia.commons.functional.FunctionalFilters.findFirst;
Optional<Integer> found = findFirst(Stream.of(1, 2), n -> n == 1);
found.isPresent(); // true
found.get(); 1
Finds the last element that matchs the predicate
import static es.rubenjgarcia.commons.functional.FunctionalFilters.findLast;
Optional<Integer> last = findLast(Stream.of(1, 2, 3), p -> p > 1 && p <= 2);
last.isPresent(); // true
last.get(); // 2
Finds first element that doesn't match the predicate
import static es.rubenjgarcia.commons.functional.FunctionalFilters.findFirstNotMatch;
Optional<Integer> found = findFirstNotMatch(Stream.of(1, 2), n -> n == 1);
found.isPresent(); // true
found.get(); // 2
Apply a map function to the element of a stream if the element matches the predicate
import static es.rubenjgarcia.commons.functional.FlowStream.mapIf;
List<Integer> list = Arrays.asList(1, 1, 1, 1);
List<Object> result = mapIf(list::stream, i -> i == 1, i -> "A")
.collect(Collectors.toList()); // [A, A, A, A]
List<Integer> list = Arrays.asList(1, 2, 2, 1);
List<Object> result = mapIf(list::stream, i -> i == 1, i -> "A")
.collect(Collectors.toList()); // [A, 2, 2, A]
Apply a map function to the element of a stream if the element matches the predicate after a mapIf code
import static es.rubenjgarcia.commons.functional.FlowStream.mapIf;
List<Integer> list = Arrays.asList(1, 2, 3, 1);
List<Object> result = mapIf(list::stream, i -> i == 1, i -> "A")
.elseIfMap(i -> i == 2, i -> "B")
.collect(Collectors.toList()); // [A, B, 3, A]
import static es.rubenjgarcia.commons.functional.FlowStream.mapIf;
List<Integer> list = Arrays.asList(1, 2, 3, 1);
List<Object> result = mapIf(list::stream, i -> i == 1, i -> "A")
.elseIfMap(i -> i == 2, i -> "B")
.elseIfMap(i -> i == 3, i -> "C")
.collect(Collectors.toList()); // [A, B, C, A]
Apply a map function to the elements of a stream that don't match any of the other if or elseif predicates
import static es.rubenjgarcia.commons.functional.FlowStream.mapIf;
List<Integer> list = Arrays.asList(1, 2, 3, 1);
List<Object> result = mapIf(list::stream, i -> i == 1, i -> "A")
.elseIfMap(i -> i == 2, i -> "B")
.elseMap(i -> "C")
.collect(Collectors.toList()); // [A, B, C, A]
import static es.rubenjgarcia.commons.functional.FlowStream.mapIf;
List<Integer> list = Arrays.asList(1, 2, 3, 1);
List<Object> result = mapIf(list::stream, i -> i == 1, i -> "A")
.elseMap(i -> "C")
.collect(Collectors.toList()); // [A, C, C, A]
Apply a map function to all the elements of the stream if any of them match the predicate
import static es.rubenjgarcia.commons.functional.FlowStream.mapIfAny;
List<Integer> list = Arrays.asList(1, 2, 2, 1);
List<Object> result = mapIfAny(list::stream, i -> i == 1, i -> "A")
.collect(Collectors.toList()); // [A, A, A, A]
Apply a map function to all the elements of the stream if any of them match the predicate and don't match the other predicates
import static es.rubenjgarcia.commons.functional.FlowStream.mapIfAny;
List<Integer> list = Arrays.asList(1, 1, 1, 1);
List<Object> result = mapIfAny(list::stream, i -> i == 2, i -> "A")
.elseIfAnyMap(i -> i == 1, i -> "B")
.collect(Collectors.toList()); // [B, B, B, B]
import static es.rubenjgarcia.commons.functional.FlowStream.mapIfAny;
List<Integer> list = Arrays.asList(1, 2, 3, 1);
List<Object> result = mapIfAny(list::stream, i -> i == 2, i -> "A")
.elseIfAnyMap(i -> i == 4, i -> "B")
.elseIfAnyMap(i -> i == 1, i -> "C")
.collect(Collectors.toList()); // [C, C, C, C]
You can combine any of the flows
import static es.rubenjgarcia.commons.functional.FlowStream.mapIf;
List<Integer> list = Arrays.asList(1, 2, 1, 1);
List<Object> result = mapIf(list::stream, i -> i == 2, i -> "A")
.elseIfAnyMap(i -> i == 1, i -> "B")
.elseMap(i -> "C")
.collect(Collectors.toList()); // [B, A, B, B]
You can use rethrowFunction
, rethrowBiFunction
, rethrowConsumer
, rethrowBiConsumer
, rethrowPredicate
, rethrowBiPredicate
or rethrowSupplier
to deal with Function, BiFunction, Consumer, BiConsumer, Predicate, BiPredicate or Supplier that throws any checked Exception
import static es.rubenjgarcia.commons.functional.FunctionalExceptions.rethrowFunction;
Stream.of("a", "b").map(rethrowFunction(s -> new String(s.getBytes(), "Foo")));
import static es.rubenjgarcia.commons.functional.FunctionalExceptions.rethrowBiFunction;
Map<String, String> map = new HashMap<>();
map.put("a", "b");
map.replaceAll(rethrowBiFunction((k, v) -> new String(k.getBytes(), "Foo")))
import static es.rubenjgarcia.commons.functional.FunctionalExceptions.rethrowConsumer;
Stream.of("a", "b").forEach(rethrowConsumer(s -> new String(s.getBytes(), "Foo")));
import static es.rubenjgarcia.commons.functional.FunctionalExceptions.rethrowBiConsumer;
Map<String, String> map = new HashMap<>();
map.put("a", "b");
map.forEach(rethrowBiConsumer((k, v) -> new String(k.getBytes(), "Foo")));
import static es.rubenjgarcia.commons.functional.FunctionalExceptions.rethrowPredicate;
Stream.of("a", "b").filter(rethrowPredicate(s -> new String(s.getBytes(), "Foo") == null));
import static es.rubenjgarcia.commons.functional.FunctionalExceptions.rethrowBiPredicate;
BiPredicate<String, String> predicate = rethrowBiPredicate((s, e) -> new String(s.getBytes(), e).isEmpty());
predicate.test("a", "Foo");
import static es.rubenjgarcia.commons.functional.FunctionalExceptions.rethrowSupplier;
rethrowPredicate(() -> new String(s.getBytes(), "Foo"));
Just add to your pom.xml
<dependency>
<groupId>es.rubenjgarcia</groupId>
<artifactId>commons-functional</artifactId>
<version>0.2.0</version>
</dependency>