如何使用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做分组操作,这是实现需求的核心:- 第一个参数是分组键生成函数:把每个entry的字符串值按
-分割,取第一部分转成Integer,作为新Map的键。 - 第二个参数指定结果Map的类型:传入
TreeMap::new,确保新Map的键是按Integer自然顺序排序的(和TreeMap的特性一致)。 - 第三个参数是下游收集器:先用
Collectors.mapping提取原entry的Long键,再用Collectors.toCollection(TreeSet::new)把这些Long值收集到TreeSet里,保证每个值集合也是有序的。
- 第一个参数是分组键生成函数:把每个entry的字符串值按
如果运行这段代码,capacities的内容会是:
{7=[1, 2, 3], 8=[4, 5]}
完全符合你给出的示例预期。
内容的提问来源于stack exchange,提问作者Nizamuddin Shaikh
相关产品推荐
相关产品推荐

