我试图用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>>
列表或收藏......它并不重要。谢谢!
答案 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()) )));