当前位置: 首页 > 知识库问答 >
问题:

Java8流中的分组方式

颜高朗
2023-03-14

我在流中使用分组:

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中出现异常。RuntimeException:不可编译的源代码-不兼容的类型:推理变量D具有不兼容的等式约束。字符串,java。lang.Integer在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.运行时异常:不可编译的源代码-不兼容的类型:推断变量K具有不兼容的边界相等约束:java.lang.字符串下界:java.lang.在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"))
);

有人能建议我如何避免编译错误吗?

共有1个答案

葛高澹
2023-03-14

你可以像以前一样通过链接groupingBy Collector来分组两次或任意多次,但这里的问题是接收器类型不正确。

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

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

因为没有必要按相同的属性分组两次。

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

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

否则,如果你想调整一个收集器来执行额外的整理转换,那么你正在寻找一个收集器。

 类似资料:
  • 我有一个订单列表,我想使用Java8Stream和Collectors按用户分组。GroupingBy: 这将返回包含用户和订单列表的映射: 我不需要整个对象User,只需要它的username字段,它是一个字符串,所以我想获得如下内容: 我试图使用stream.map将用户映射到username字段,但无法正确实现。我怎样才能尽可能简单地做到这一点呢?

  • 我正在使用我有一个类,如下所示: 现在我想做的是: 筛选出senderId无效的记录(使用映射) 下面是我的代码: 这给我带来了一个错误: 错误:(105,90)java:找不到适用于groupingBy(共享[…]的方法gMode,java。util。作用函数)方法java。util。流动收藏家。groupingBy(java.util.function.function)不适用(无法推断类型变

  • 我有以下两门课: : : 我希望进行流操作,以便: 将映射到中的 的和分别合并到和中,对于所有具有相同id的s 为此,我编写了以下一段代码: 它的工作和输出如下: 但我相信有一种更好的方式可以达到同样的效果。任何一个指针都很好。

  • 问题内容: Java 8中有什么方法可以将一个元素分组而不收集它们?我希望结果再次出现。因为我必须处理大量数据甚至是无限流,所以我无法先收集数据并再次流处理结果。 所有需要分组的元素在第一流中都是连续的。因此,我喜欢使流评估保持懒惰。 问题答案: 无法使用标准Stream API做到这一点。通常,您无法执行此操作,因为将来总是有可能出现属于任何已创建组的新项目,因此,在处理所有输入之前,您无法将组

  • 在Java8中有什么方法可以在中分组元素而不收集它们吗?我希望结果再次成为。因为我必须处理大量的数据,甚至是无限的流,所以我不能首先收集数据,然后再次流化结果。 所有需要分组的元素在第一个流中是连续的。因此,我喜欢保持流评估懒惰。

  • 给java类一些东西 我有一张物品清单 我希望能够对它们进行排序,这样它们就可以按照每个父对象的虚数的累积和排序,然后再按照虚数排序。 所以我最终 我知道用parentKey和sum of noThings映射它是 我想,也许包装我的Something类并获得每个父项的总密钥可能会在某种程度上起作用。 但看起来工作量很大,不太优雅。 如有任何意见/想法,将不胜感激。