There seems to be no flat map collector that can be used as a downstream for groupingBy in Java8, but it was proposed and adopted for Java9: https://bugs.openjdk.java.net/browse/JDK-8071600
public static <T, U, A, R> Collector<T, ?, R> flatMapping(Function<? super T, ? extends Stream<? extends U>> mapper, Collector<? super U, A, R> downstream) { BiConsumer<A, ? super U> downstreamAccumulator = downstream.accumulator(); return Collector.of(downstream.supplier(), (r, t) -> mapper.apply(t).sequential().forEach(u -> downstreamAccumulator.accept(r, u)), downstream.combiner(), downstream.finisher(), downstream.characteristics().stream().toArray(Collector.Characteristics[]::new)); }
If you use this, and also add the quantities method to Assignment , which returns Stream<Quantity> , you can use this code:
Map<Integer, List<Quantity>> result = assignments.stream() .collect(groupingBy(Assignment::getIndex, flatMapping(Assignment::quantities, toList())));
source share