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

如何使用Stream将TreeMap转换为指定结构的新TreeMap

使用Java Stream实现需求

没问题,这就给你提供用Stream完成转换的方案,完美匹配你想要的结果:

// 你的原始TreeMap
TreeMap<Long,String> gasType = new TreeMap<>();
gasType.put(1L, "7-1.50");
gasType.put(2L, "7-1.50");
gasType.put(3L, "7-3.00");
gasType.put(4L, "8-5.00");
gasType.put(5L, "8-7.00");

// 用Stream完成转换
Map<Integer, TreeSet<Long>> capacities = gasType.entrySet()
    .stream()
    .collect(Collectors.groupingBy(
        // 提取原value中的int部分作为新Map的键
        entry -> Integer.parseInt(entry.getValue().split("-")[0]),
        // 指定结果Map为TreeMap,保持键的有序性
        TreeMap::new,
        // 将匹配的原Long键收集到TreeSet中
        Collectors.mapping(Map.Entry::getKey, Collectors.toCollection(TreeSet::new))
    ));

代码解释:

  • 流的起点:从gasType.entrySet().stream()获取所有键值对的流,这样我们能同时拿到原Map的键(Long类型)和值(字符串)。
  • 分组逻辑:使用Collectors.groupingBy做分组操作,这是实现需求的核心:
    1. 第一个参数是分组键生成函数:把每个entry的字符串值按-分割,取第一部分转成Integer,作为新Map的键。
    2. 第二个参数指定结果Map的类型:传入TreeMap::new,确保新Map的键是按Integer自然顺序排序的(和TreeMap的特性一致)。
    3. 第三个参数是下游收集器:先用Collectors.mapping提取原entry的Long键,再用Collectors.toCollection(TreeSet::new)把这些Long值收集到TreeSet里,保证每个值集合也是有序的。

如果运行这段代码,capacities的内容会是:

{7=[1, 2, 3], 8=[4, 5]}

完全符合你给出的示例预期。

内容的提问来源于stack exchange,提问作者Nizamuddin Shaikh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:06:26