org.kiwiproject.stream.KiwiMultimapCollectors Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of kiwi Show documentation
Show all versions of kiwi Show documentation
Kiwi is a utility library. We really like Google's Guava, and also use Apache Commons.
But if they don't have something we need, and we think it is useful, this is where we put it.
package org.kiwiproject.stream;
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.HashMultimap;
import com.google.common.collect.LinkedHashMultimap;
import com.google.common.collect.Multimap;
import lombok.experimental.UtilityClass;
import java.util.Map;
import java.util.function.Supplier;
import java.util.stream.Collector;
/**
* A {@link Collector} that can collect into a Guava {@link Multimap}.
*/
@UtilityClass
public class KiwiMultimapCollectors {
/**
* Given a stream of {@link Map.Entry} objects, collects to the {@link Multimap} specified in the
* {@code supplier} argument. This lets you create any type of Multimap you want to collect into. Usually you
* will use a method reference as the supplier, e.g. {@code ArrayListMultimap:create}. You can easily get a
* stream of Map.Entry objects by getting the map's {@link Map#entrySet()} and then calling stream on it, e.g.
* {@code someMap.entrySet().stream()}.
*
* @param supplier the Multimap to collect into
* @param the key type of the Map.Entry objects
* @param the value type of the Map.Entry objects
* @param the accumulator type, i.e. some kind of Multimap
* @return the collected Multimap
*/
public static > Collector, A, A> toMultimap(Supplier supplier) {
return Collector.of(
supplier,
(accumulator, entry) -> accumulator.put(entry.getKey(), entry.getValue()),
(map1, map2) -> {
map1.putAll(map2);
return map1;
});
}
/**
* Collects into an {@link ArrayListMultimap}.
*
* @param the key type of the Map.Entry objects
* @param the value type of the Map.Entry objects
* @return the collected ArrayListMultimap
*/
public static Collector, Multimap, Multimap> toArrayListMultimap() {
return toMultimap(ArrayListMultimap::create);
}
/**
* Collects into an {@link HashMultimap}.
*
* @param the key type of the Map.Entry objects
* @param the value type of the Map.Entry objects
* @return the collected HashMultimap
*/
public static Collector, Multimap, Multimap> toHashMultimap() {
return toMultimap(HashMultimap::create);
}
/**
* Collects into an {@link LinkedHashMultimap}.
*
* @param the key type of the Map.Entry objects
* @param the value type of the Map.Entry objects
* @return the collected LinkedHashMultimap
*/
public static Collector, Multimap, Multimap> toLinkedHashMultimap() {
return toMultimap(LinkedHashMultimap::create);
}
}