本文详解如何使用 Java 8 Stream API 将 List 中的偶数作为 key、其平方作为 value 构建 Map,并指出常见误区(如错误地提前映射导致 key 丢失)。
本文详解如何使用 java 8 stream api 将 list
在 Java 8 中,Stream API 提供了声明式、函数式的数据处理能力。将列表转换为映射(Map
正确做法是:仅在 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>
⚠️ 关键注意事项:
- ❌ 错误写法:.map(n -> n * n) 放在 collect 前 —— 此时流中只剩平方值(如 452→204304),toMap 的 key mapper n -> n 实际拿到的是 204304,最终得到 {204304=204304, ...},完全偏离需求;
- ✅ 正确逻辑:filter 后流中仍为原始偶数,toMap 的两个函数分别独立作用于同一元素,确保 key/value 语义对齐;
- 若源列表含重复偶数(如 [4, 6, 4]),建议保留 .distinct() 或在 toMap 中指定 merge function(如 (v1, v2) -> v1)避免 IllegalStateException;
- Collectors.toMap 要求 key 不可重复,因此业务逻辑中需确保 key 的唯一性(本例中偶数值天然唯一,但若需按其他规则分组则需额外设计)。
通过合理划分操作阶段(筛选 → 映射关系定义 → 收集),Stream 流程清晰、可读性强,是构建此类键值映射的推荐方式。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











