1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
| import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Optional; import java.util.Set; import java.util.function.BinaryOperator; import java.util.function.Function; import java.util.function.Predicate; import java.util.stream.Collector; import java.util.stream.Collectors;
public final class FunUtils {
private FunUtils() { }
public static <T, R> List<R> toList(List<T> list, Function<T, R> mapper) { return convert(list, mapper, Collectors.toList()); }
public static <T, R> Set<R> toSet(List<T> list, Function<T, R> mapper) { return convert(list, mapper, Collectors.toSet()); }
private static <T, R, C extends Collection<R>> C convert(List<T> list, Function<T, R> mapper, Collector<R, ?, C> collector) { return emptyIfNull(list).stream().map(mapper).collect(collector); }
public static <K, V> Map<K, V> toMap(List<V> list, Function<V, K> keyFunc) { return toMap(list, keyFunc, v -> v); }
public static <T, K, V> Map<K, V> toMap(List<T> list, Function<T, K> keyFunc, Function<T, V> valFunc) { return emptyIfNull(list).stream() .filter(Objects::nonNull) .collect(Collectors.toMap(keyFunc, valFunc)); }
public static <K, V> Map<K, V> toMapQuietly(List<V> list, Function<V, K> keyFunc) { return toMapQuietly(list, keyFunc, v -> v); }
public static <T, K, V> Map<K, V> toMapQuietly(List<T> list, Function<T, K> keyFunc, Function<T, V> valFunc) { return emptyIfNull(list).stream() .filter(Objects::nonNull) .collect(Collectors.toMap(keyFunc, valFunc, (a, b) -> b)); }
public static <T, K> Map<K, List<T>> groupBy(List<T> list, Function<T, K> keyFunc) { return emptyIfNull(list).stream() .filter(Objects::nonNull) .collect(Collectors.groupingBy(keyFunc)); }
public static <T> List<T> filter(List<T> list, Predicate<T> pred) { return emptyIfNull(list).stream().filter(pred).collect(Collectors.toList()); }
public static <T> List<T> filterNotNull(List<T> list) { return filter(list, Objects::nonNull); }
public static <T, K> List<T> distinctByKey(List<T> list, Function<T, K> keyFunc) { Set<K> seen = new HashSet<>(); return filter(filterNotNull(list), t -> seen.add(keyFunc.apply(t))); }
public static <T> List<T> emptyIfNull(List<T> list) { return list == null ? Collections.emptyList() : list; }
public static <T> Optional<T> findFirst(List<T> list, Predicate<T> pred) { return emptyIfNull(list).stream().filter(pred).findFirst(); }
public static <T> Optional<T> findAny(List<T> list, Predicate<T> pred) { return emptyIfNull(list).stream().filter(pred).findAny(); } }
|