You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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())
    ));

代码说明

  1. flatMap展开流:每个JobQueue包含多个Partition,通过flatMap将每个Partition转换为一个包含partitionId和所属JobQueue的processKey的键值对,把多维的队列-分区结构平铺为一维的键值对流。
  2. 分组收集:
    • 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 04:33:24