package org.molgenis.util.stream; import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.LinkedHashMultimap; import com.google.common.collect.Multimap; import java.util.Map.Entry; import java.util.function.Function; import java.util.function.Supplier; import java.util.stream.Collector; import java.util.stream.Collectors; /** * Collectors that collect to {@link Multimap}. * * @see {@link Collectors#toMap(Function, Function)}, the equivalent of which is not (yet?) present in guava for the * {@link Multimap}. */ public class MultimapCollectors { public static <K, V, E> Collector<E, ArrayListMultimap<K, V>, ArrayListMultimap<K, V>> toArrayListMultimap( Function<E, K> keyGenerator, Function<E, V> valueGenerator) { return toMultimap(ArrayListMultimap::<K, V>create, keyGenerator, valueGenerator); } public static <K, V, A extends Multimap<K, V>, E> Collector<E, A, A> toMultimap(Supplier<A> supplier, Function<E, K> keyGenerator, Function<E, V> valueGenerator) { return Collector.of(supplier, (map, entry) -> map.put(keyGenerator.apply(entry), valueGenerator.apply(entry)), (map1, map2) -> { map1.putAll(map2); return map1; }); } public static <K, V, A extends Multimap<K, V>> Collector<Entry<K, V>, A, A> toMultimap(Supplier<A> supplier) { return toMultimap(supplier, Entry::getKey, Entry::getValue); } public static <K, V> Collector<Entry<K, V>, LinkedHashMultimap<K, V>, LinkedHashMultimap<K, V>> toLinkedHashMultimap() { return toMultimap(LinkedHashMultimap::<K, V>create); } }