我正在尝试通过对带有Java流的对象的两个属性进行分组。正如一些答案所记录的那样,这很容易:products.stream().collect(
Collectors.groupingBy(Product::getUpc,
Collectors.groupingBy(Product::getChannelIdentifier)));
例如,上面的代码片段将生成以下形式的MapsMap<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/