微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用groupingBy的类属性的平面映射收集器

如何解决使用groupingBy的类属性的平面映射收集器

似乎没有平面映射收集器可groupingBy在Java8中用作下游,但已被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));
    }

如果使用该代码,并且还添加一个返回的quantities方法,则可以使用以下代码Assignment``Stream<Quantity>

Map<Integer, List<Quantity>> result = assignments.stream()
    .collect(groupingBy(Assignment::getIndex, 
        flatMapping(Assignment::quantities, toList())));

解决方法

我上这堂课

class Assignment {
  private Integer index;
  private List<Quantity> quantities;
}

然后,我有该类对象的列表。

List<Assigment> assignments = new ArrayList<>();

有没有一种方法创建一个Map包含from AssignmentList<Quantity>as值的索引?

到目前为止,这是我尝试过的。

assignments.stream().collect(groupingBy(Assignment::getIndex));

但这给我一个Map<Integer,List<Assignment>>,我想要一个Map<Integer,List<Quantity>>

我已经尝试过使用forEach方法-它可以工作-但我确定必须有一种方法可以在一个衬里中进行操作-
或者至少仅使用collectgroupingBy方法

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。