电子商务网站保密协议,建设厅质监总站网站,asp网页编辑器,上街网络推广您不能通过多个键对单个项目进行分组#xff0c;除非您接受该项目可能会出现在多个组中。在这种情况下#xff0c;您想要执行一种flatMap操作。实现此目的的一种方法是Stream.flatMap与临时对一起使用#xff0c;以容纳和的组合#xff0c;Item然后SubItem再进行收集。由于…您不能通过多个键对单个项目进行分组除非您接受该项目可能会出现在多个组中。在这种情况下您想要执行一种flatMap操作。实现此目的的一种方法是Stream.flatMap与临时对一起使用以容纳和的组合Item然后SubItem再进行收集。由于不存在标准对类型因此典型的解决方案是Map.EntryMap result pojo.getItems().stream().flatMap(item - item.subItems.stream().map(sub - new AbstractMap.SimpleImmutableEntry(item, sub))).collect(Collectors.groupingBy(e - e.getKey().getKey1(),Collectors.mapping(Map.Entry::getValue,Collectors.groupingBy(SubItem::getKey2))));不需要这些临时对象的替代方法是flatMap直接在收集器中执行操作但是不幸的flatMapping是直到Java 9才存在。这样解决方案看起来像Map result pojo.getItems().stream().collect(Collectors.groupingBy(Item::getKey1,Collectors.flatMapping(item - item.getSubItems().stream(),Collectors.groupingBy(SubItem::getKey2))));如果我们不想等待Java 9可以在代码库中添加一个类似的收集器因为实现起来并不难static Collector flatMapping(Function super T,? extends Stream extends U mapper,Collector super U,A,R downstream) {BiConsumer acc downstream.accumulator();return Collector.of(downstream.supplier(),(a, t) - { try(Stream extends U smapper.apply(t)) {if(s!null) s.forEachOrdered(u - acc.accept(a, u));}},downstream.combiner(), downstream.finisher(),downstream.characteristics().toArray(new Collector.Characteristics[0]));}