在Java8-Streams中进行分组

问题描述 投票:1回答:1

我在Streams中使用Grouping-By:

1:我想知道如何在Collect方法中两次使用“Grouping-By”。

2:其次,在分组中定义返回类型的策略是什么?

1:

Map<String,String> sum1 = Items.items().stream()
                       .collect(Collectors.groupingBy(Items::getName,
                               Collectors.groupingBy(Items::getName)));

错误信息:

1:线程“main”中的异常java.lang.RuntimeException:无法编译的源代码 - 不兼容的类型:推理变量D具有不兼容的等式约束java.lang.String,java.lang.Integer at collectorsinjava.CollectorsInJava.main(CollectorsInJava.java: 33)

2:

     Map<String, Map<String,Integer>> sum1 = Items.items().stream()
                .collect(Collectors.groupingBy(Items::getName,
                            Collectors.groupingBy(Items::getQuantity)));

错误信息:

2:线程“main”中的异常java.lang.RuntimeException:无法编译的源代码 - 不兼容的类型:推理变量K具有不兼容的边界等式约束:java.lang.String下界:java.lang.Integer at collectorsinjava.CollectorsInJava.main( CollectorsInJava.java:37)

这是我的项目清单:

List<Items> item = Arrays.asList(new Items("A",22,new BigDecimal("23.3")),
 new Items("B",33,new BigDecimal("19.99")),

 new Items("C",31,new BigDecimal("23.3")),

 new Items("D",22,new BigDecimal("19.99")),

 new Items("B",33,new BigDecimal("23.3")),

 new Items("C",31,new BigDecimal("19.99")),

 new Items("D",22,new BigDecimal("23.3"))
);

有人可以建议我如何避免编译错误?

java java-stream
1个回答
1
投票

您可以通过链接groupingBy收集器进行两次或多次组合,但问题是接收器类型不正确。

第一个查询的接收器类型应该是:

Map<String, List<Items>> resultSet = Items.items().stream()
            .collect(Collectors.groupingBy(Items::getName));

因为不需要将同一属性分组两次。

当您将两个或多个分组收集器链接在一起时,您将收到一个多级映射,因此第二个查询的接收器类型应为:

Map<String, Map<Integer, List<Items>>> anotherResultSet

否则,如果您想调整收集器以执行额外的整理转换,那么您正在寻找collectingAndThen

© www.soinside.com 2019 - 2024. All rights reserved.