如何用Java 8 Stream groupingBy重写分组逻辑生成指定Map?
使用Java 8 Collectors.groupingBy重写分组逻辑
你可以通过Stream的flatMap配合Collectors.groupingBy来实现和传统写法完全一致的逻辑,代码更简洁且符合函数式编程风格:
import java.util.AbstractMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; // 假设queues是List<JobQueue>类型 Map<Integer, List<Long>> processKeyMap = queues.stream() // 把每个JobQueue展开为(partitionId, processKey)的键值对流 .flatMap(jobQueue -> jobQueue.getPartitions().stream() .map(partition -> new AbstractMap.SimpleEntry<>(partition.getPartitionId(), jobQueue.getProcessKey())) ) // 按partitionId分组,收集对应的processKey列表 .collect(Collectors.groupingBy( Map.Entry::getKey, Collectors.mapping(Map.Entry::getValue, Collectors.toList()) ));
代码说明
- flatMap展开流:每个
JobQueue包含多个Partition,通过flatMap将每个Partition转换为一个包含partitionId和所属JobQueue的processKey的键值对,把多维的队列-分区结构平铺为一维的键值对流。 - 分组收集:
Collectors.groupingBy(Map.Entry::getKey)指定以partitionId作为分组的key;- 第二个参数
Collectors.mapping(Map.Entry::getValue, Collectors.toList())负责把每个分组里的键值对的value(也就是processKey)提取出来,收集为List<Long>。
可选:指定HashMap作为结果容器
如果需要和你原来的传统写法一样,明确使用HashMap作为结果的Map实现,可以在groupingBy中传入Map的构造器:
Map<Integer, List<Long>> processKeyMap = queues.stream() .flatMap(jobQueue -> jobQueue.getPartitions().stream() .map(partition -> new AbstractMap.SimpleEntry<>(partition.getPartitionId(), jobQueue.getProcessKey())) ) .collect(Collectors.groupingBy( Map.Entry::getKey, HashMap::new, // 指定使用HashMap Collectors.mapping(Map.Entry::getValue, Collectors.toList()) ));
内容的提问来源于stack exchange,提问作者Shalaj
相关产品推荐
相关产品推荐

