164. Java Lambda 表达式 - Java 函数式编程小技巧:认识 Function.identity()

184 阅读1分钟

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}

这里我们把每个字符串作为 keyvalue 放进 map 中:

  • Function.identity() 就省去了你重复写 x -> x 这种形式。

🧠 什么时候使用 identity()

场景举例优势
保持原样返回.map(Function.identity())更简洁,更表达意图
创建 key-value 映射时值不变.toMap(Function.identity(), ...)避免重复写 lambda
作为默认值函数默认值函数为 “保持原值”直观、清晰

💡 类比理解

函数类型示例作用
加工函数s -> s.toUpperCase()对输入做修改
身份函数s -> sFunction.identity()保持输入不变

🧪 小练习题

  1. 写一个 List<Integer>,使用 stream().map(Function.identity()) 来演示 identity 函数是否真的不改变值。
  2. Collectors.toMap(Function.identity(), x -> x.length()) 把字符串列表变成 map,其中键是字符串本身,值是它的长度。