
本文详解如何使用 Java 8 Stream API 将 List 中的偶数提取为 Map 的键,并将其平方值作为对应值,避免常见误用(如提前映射导致键丢失)。
本文详解如何使用 java 8 stream api 将 list
在 Java 8 中,Stream 与 Collectors.toMap() 是构建键值映射的高效组合。但初学者常误在 map() 阶段就对元素整体变换(例如直接计算平方),这会导致原始数值丢失——而后续 toMap() 的 key mapper 无法再获取原偶数值,从而无法构建“偶数 → 平方”的正确映射关系。
正确的逻辑链应为:
✅ 过滤出偶数 → ✅ 去重(可选)→ ✅ 在 toMap() 的 value mapper 中仅对值进行平方运算,而 key mapper 保持原始偶数值。
以下是修正后的完整示例代码:
import java.util.*;
import java.util.stream.Collectors;
public class SquareNumber {
public static void main(String[] args) {
List<integer> numbers = Arrays.asList(289, 452, 533, 656, 744);
Map<integer integer> evenToSquare = numbers.stream()
.filter(n -> n % 2 == 0) // 保留偶数:452, 656, 744
.distinct() // 可选:去重(本例无重复)
.collect(Collectors.toMap(
n -> n, // key: 偶数本身
n -> n * n // value: 该偶数的平方
));
System.out.println(evenToSquare);
// 输出:{452=204304, 656=430336, 744=553536}
}
}</integer></integer>
⚠️ 关键注意事项:
- 若输入列表含重复偶数(如 Arrays.asList(4, 6, 4)),toMap() 默认会抛出 IllegalStateException(重复 key)。此时需提供合并函数,例如:
.collect(Collectors.toMap(n -> n, n -> n * n, (v1, v2) -> v1))
- filter() 和 distinct() 应在 collect() 之前完成,确保流中保留的是原始偶数值,而非已变换的平方值。
- n -> n*n 仅作用于 value mapper,是实现“键值语义分离”的核心技巧。
掌握这一模式,可灵活扩展至任意 List
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











