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
,其中键是字符串本身,值是它的长度。