package io.kaif.util; import java.util.function.BinaryOperator; import java.util.function.Function; import java.util.stream.Collector; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; public class MoreCollectors { public static <T> Collector<T, ?, ImmutableList<T>> toImmutableList() { return Collector.of(ImmutableList::<T>builder, ImmutableList.Builder<T>::add, (left, right) -> left.addAll(right.build()), ImmutableList.Builder::build); } public static <T> Collector<T, ?, ImmutableSet<T>> toImmutableSet() { return Collector.of(ImmutableSet::<T>builder, ImmutableSet.Builder<T>::add, (left, right) -> left.addAll(right.build()), ImmutableSet.Builder::build); } /** * keyMapper result must be unique */ public static <T, K, U> Collector<T, ?, ImmutableMap<K, U>> toImmutableMap(// Function<? super T, ? extends K> keyMapper, // Function<? super T, ? extends U> valueMapper) { return Collector.of(ImmutableMap::<K, U>builder, (ImmutableMap.Builder<K, U> builder, T item) -> { builder.put(keyMapper.apply(item), valueMapper.apply(item)); }, throwingMerger(), ImmutableMap.Builder::build); } /** * copy from jdk Collectors, for toMap only */ private static <T> BinaryOperator<T> throwingMerger() { return (u, v) -> { throw new IllegalStateException(String.format("Duplicate key %s", u)); }; } private MoreCollectors() { } }