Java 8-按集合映射的多个组

时间:2015-10-29 21:40:23

标签: java-8 java-stream

我试图用Java流对一个对象的两个属性进行 groupingBy 。这很容易,一些答案记录了这些:

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

例如,上面的代码段将以

的形式生成地图地图
Map<String, Map<String, List<Product>>>

如果地图上有UPC代码的密钥,其值是带有引用产品列表的渠道标识符键的地图。

很酷,但是如果我不需要嵌套值作为地图呢?也就是说,我想通过ChannelIdentifier组织嵌套集合,但我只关心地图的.values(),而不是地图本身。有没有办法得到与以下内容相符的结果?

Map<String, List<List<Product>>

列表或收藏......它并不重要。谢谢!

1 个答案:

答案 0 :(得分:10)

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

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

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

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