使用groupingBy的类的属性的平面映射收集器
我有这门课。
class Assignment { private Integer index; private List quantities; }
然后,我有一个来自该类的对象列表。
List assignments = new ArrayList();
有没有办法创建一个包含Assignment
索引和List
作为值的Map
?
这是我到目前为止所尝试的。
assignments.stream().collect(groupingBy(Assignment::getIndex));
但这给了我一个Map<Integer, List>
,我想要一个Map<Integer, List>
。
我已经尝试过使用forEach
方法 – 并且它有效 – 但我确信必须有一种方法可以在一个衬里中进行 – 或者至少只使用collect
和groupingBy
方法
看起来没有平面映射收集器可以用作Java8中groupingBy
的下游,但它已被Java9提出并被接受: https ://bugs.openjdk.java.net/browse/JDK- 8071600
public static Collector flatMapping(Function super T, ? extends Stream extends U>> mapper, Collector super U, A, R> downstream) { BiConsumer 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)); }
如果您使用那个,并且还将一个quantities
方法添加到Assignment
返回Stream
,您可以使用以下代码:
Map> result = assignments.stream() .collect(groupingBy(Assignment::getIndex, flatMapping(Assignment::quantities, toList())));