In case you want to group given collection by some field, and each group could contain multiple objects. This is part of my GroupUtils:
public static <K, V> Map<K, List<V>> groupMultipleBy(Collection<V> data, Function<V, K> classifier) {
return Optional.ofNullable(data).orElse(Collections.emptyList()).stream().collect(Collectors.groupingBy(classifier, Collectors.mapping(Function.identity(), Collectors.toList())));
}
Using example.
You have following class:
class A {
private String id;
private String name;
}
and to group collection of this class, you could with:
List<A> collection = Collections.emptyList();
Map<String, List<A>> groupedById = GroupUtils.groupMultipleBy(collection, A::getId);
P.S.
To give you more options, this relative part of my GroupUtils:
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public final class GroupUtils {
public static <K, V> Map<K, List<V>> groupMultipleBy(Collection<V> data, Function<V, K> classifier) {
return groupMultipleBy(data, classifier, Function.identity());
}
public static <K, V, S> Map<K, List<S>> groupMultipleBy(Collection<V> data, Function<V, K> classifier, Function<V, S> mapper) {
return groupMultipleBy(data, classifier, mapper, Collectors.toList());
}
public static <K, V, S, R extends Collection<S>> Map<K, R> groupMultipleBy(Collection<V> data, Function<V, K> classifier,
Collector<S, ?, R> downstream) {
return groupMultipleBy(data, classifier, (Function<V, S>)Function.identity(), downstream);
}
public static <K, V, S, R extends Collection<S>> Map<K, R> groupMultipleBy(Collection<V> data, Function<V, K> classifier,
Function<V, S> mapper, Collector<S, ?, R> downstream) {
return Optional.ofNullable(data).orElse(Collections.emptyList()).stream()
.collect(Collectors.groupingBy(classifier, Collectors.mapping(mapper, downstream)));
}
public static <K, V> Map<K, V> groupSingleBy(Collection<V> data, Function<V, K> keyMapper) {
return groupSingleBy(data, keyMapper, Function.identity());
}
public static <K, V, S> Map<K, S> groupSingleBy(Collection<V> data, Function<V, K> keyMapper, Function<V, S> valueMapper) {
return Optional.ofNullable(data).orElse(Collections.emptyList()).stream().collect(Collectors.toMap(keyMapper, valueMapper));
}
}