ala*_*yor 6 java java-8 java-stream
我有这门课.
class Assignment {
private Integer index;
private List<Quantity> quantities;
}
Run Code Online (Sandbox Code Playgroud)
然后,我有一个来自该类的对象列表.
List<Assigment> assignments = new ArrayList<>();
Run Code Online (Sandbox Code Playgroud)
有没有办法创建一个Map包含索引Assignment和List<Quantity>as值的方法?
这是我到目前为止所尝试的.
assignments.stream().collect(groupingBy(Assignment::getIndex));
Run Code Online (Sandbox Code Playgroud)
但这给了我一个Map<Integer, List<Assignment>>,我想要一个Map<Integer, List<Quantity>>.
我已经尝试过使用forEach方法 - 它可以工作 - 但我确信必须有一种方法可以在一个衬里中完成它 - 或者至少只使用collect和groupingBy方法
Jor*_*nee 13
看起来没有平面映射收集器可以用作groupingByJava8的下游,但它已被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));
}
Run Code Online (Sandbox Code Playgroud)
如果你使用那个,并且还添加一个返回a 的quantities方法,你可以使用这个代码:AssignmentStream<Quantity>
Map<Integer, List<Quantity>> result = assignments.stream()
.collect(groupingBy(Assignment::getIndex,
flatMapping(Assignment::quantities, toList())));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1301 次 |
| 最近记录: |