首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java 8-集合映射的多重组

Java 8-集合映射的多重组
EN

Stack Overflow用户
提问于 2015-10-29 21:40:23
回答 1查看 9K关注 0票数 6

我试图用Java对对象的两个属性执行groupingBy。正如一些答案所证明的那样,这是相当容易的:

代码语言:javascript
复制
products.stream().collect(
        Collectors.groupingBy(Product::getUpc, 
        Collectors.groupingBy(Product::getChannelIdentifier)));

例如,上面的片段将在表单中生成一个地图地图

代码语言:javascript
复制
Map<String, Map<String, List<Product>>>

其中,映射具有UPC码的键,其值是具有引用产品列表的通道标识符键的映射。

这很酷,但是如果我不需要嵌套值作为映射呢?也就是说,我想通过ChannelIdentifier组织嵌套的集合,但我只关心映射的.values(),而不是映射本身。是否有一种方法可以得到与以下结果相匹配的结果?

代码语言:javascript
复制
Map<String, List<List<Product>>

清单或收藏..。无所谓。谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-29 22:16:43

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

代码语言:javascript
复制
Map<String, Collection<List<Product>>> m=products.stream().collect(
    Collectors.groupingBy(Product::getUpc, Collectors.collectingAndThen(
        Collectors.groupingBy(Product::getChannelIdentifier), Map::values)));

如果生成的映射具有更长的生存期,并且希望减少所需的存储空间,或者如果需要List,则可以在该步骤期间将视图复制到列表中:

代码语言:javascript
复制
Map<String, List<List<Product>>> map=products.stream().collect(
    Collectors.groupingBy(Product::getUpc, Collectors.collectingAndThen(
        Collectors.groupingBy(Product::getChannelIdentifier),
        m -> new ArrayList<>(m.values()) )));
票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33425107

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档