我试图用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>>清单或收藏..。无所谓。谢谢!
发布于 2015-10-29 22:16:43
分组操作不可避免地需要维护一个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()) )));https://stackoverflow.com/questions/33425107
复制相似问题