164. Java Lambda 表达式 - Java 函数式编程小技巧:认识 Function.identity()
在 Java 中,有时你只需要一个什么都不做、原样返回输入参数的函数,这种函数叫做:
✅ 身份函数(
Identity Function)
Java 为此提供了一个静态工厂方法:Function.identity()。
🎯 语法示例:
Function<String, String> id = Function.identity();
这个函数的作用非常简单:
- 你传进去什么,它就原样返回什么。
- 就像一面镜子 —— “我不做任何处理,只是把你照样返回。”
📦 使用 identity 的场景举例
✅ 在 Map 操作中保持值不变
List<String> names = List.of("Alice", "Bob", "Charlie");
Map<String, String> nameMap = names.stream()
.collect(Collectors.toMap(Function.identity(), Function.identity()));
System.out.println(nameMap);
// 输出: {Alice=Alice, Bob=Bob, Charlie=Charlie}
这里我们把每个字符串作为 key 和 value 放进 map 中:
Function.identity()就省去了你重复写x -> x这种形式。
🧠 什么时候使用 identity()?
| 场景 | 举例 | 优势 |
|---|---|---|
| 保持原样返回 | .map(Function.identity()) | 更简洁,更表达意图 |
创建 key-value 映射时值不变 | .toMap(Function.identity(), ...) | 避免重复写 lambda |
| 作为默认值函数 | 默认值函数为 “保持原值” | 直观、清晰 |
💡 类比理解
| 函数类型 | 示例 | 作用 |
|---|---|---|
| 加工函数 | s -> s.toUpperCase() | 对输入做修改 |
| 身份函数 | s -> s 或 Function.identity() | 保持输入不变 |
🧪 小练习题
- 写一个
List<Integer>,使用stream().map(Function.identity())来演示identity函数是否真的不改变值。 - 用
Collectors.toMap(Function.identity(), x -> x.length())把字符串列表变成map,其中键是字符串本身,值是它的长度。