gpt4 book ai didi

java-8 - Java 8- Multiple Group by进入集合映射

转载 作者:行者123 更新时间:2023-12-03 09:59:55 24 4
gpt4 key购买 nike

我正在尝试通过对带有Java流的对象的两个属性进行分组。正如一些答案所记录的那样,这很容易:

products.stream().collect(
Collectors.groupingBy(Product::getUpc,
Collectors.groupingBy(Product::getChannelIdentifier)));

例如,上面的代码片段将生成以下形式的Maps
Map<String, Map<String, List<Product>>>

映射具有UPC代码的键,并且其值是具有 channel 标识符的键的映射,该 channel 标识符引用了产品列表。

太酷了,但是如果我不需要嵌套值成为 map 怎么办?也就是说,我想通过ChannelIdentifier来组织嵌套的集合,但是我只关心 map 的.values(),而不关心 map 本身。有没有一种方法可以得到与以下结果匹配的结果?
Map<String, List<List<Product>>

列表或集合...没关系。谢谢!

最佳答案

分组操作不可避免地需要维护Map,因为它必须跟踪分组的键值。但是您可以直接使用values() View :

Map<String, Collection<List<Product>>> m=products.stream().collect(
Collectors.groupingBy(Product::getUpc, Collectors.collectingAndThen(
Collectors.groupingBy(Product::getChannelIdentifier), Map::values)));

如果生成的 map 的生命周期更长,并且您想减少所需的存储空间,或者如果需要 List,则可以在该步骤中将 View 复制到列表中:
Map<String, List<List<Product>>> map=products.stream().collect(
Collectors.groupingBy(Product::getUpc, Collectors.collectingAndThen(
Collectors.groupingBy(Product::getChannelIdentifier),
m -> new ArrayList<>(m.values()) )));

关于java-8 - Java 8- Multiple Group by进入集合映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33425107/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com