我在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"))
);
有人可以建议我如何避免编译错误?
您可以通过链接groupingBy收集器进行两次或多次组合,但问题是接收器类型不正确。
第一个查询的接收器类型应该是:
Map<String, List<Items>> resultSet = Items.items().stream()
.collect(Collectors.groupingBy(Items::getName));
因为不需要将同一属性分组两次。
当您将两个或多个分组收集器链接在一起时,您将收到一个多级映射,因此第二个查询的接收器类型应为:
Map<String, Map<Integer, List<Items>>> anotherResultSet
否则,如果您想调整收集器以执行额外的整理转换,那么您正在寻找collectingAndThen。