Java 8 Lambda方法工作原理、Java 7等效实现及t->t用法问询
关于Java 8 Function接口中identity方法的解析及Java 7等效实现
咱们先从你贴的这个接口说起,它和Java 8标准库的java.util.function.Function是同类型的函数式接口——这类接口只有一个抽象方法(这里就是apply(T t)),所以能直接用Lambda表达式来实现。
一、t->t与identity()方法的工作逻辑
identity()是个静态方法,它返回的是一个恒等函数,说白了就是“输入啥就原封不动返回啥”的函数。而t->t这个Lambda就是这个恒等函数的具体实现:
t是函数的输入参数,类型由泛型T自动推导->是Lambda的语法分隔符,左边是参数,右边是方法体- 后面的
t就是方法体,直接把输入参数返回回去
这个方法的实用场景挺多的,比如在Stream操作里,当你需要一个“不做任何转换,直接传递元素”的映射函数时,用它就很简洁:
List<String> names = Arrays.asList("Alice", "Bob"); // 用identity()做映射,结果和原列表完全一致 List<String> sameNames = names.stream().map(Function.identity()).collect(Collectors.toList());
另外,在一些需要传递函数式接口参数,但又不需要做任何逻辑处理的场景下,它比手写空转换逻辑要清爽得多。
二、Java 7的等效实现
Java 7没有Lambda语法糖,也没有内置的Function接口,所以得用匿名内部类来复刻这套逻辑,步骤如下:
1. 先定义等效的Function接口
Java 7的接口不支持静态方法,所以先把核心的抽象方法抽出来:
public interface Function<T, R> { R apply(T t); }
2. 用工具类实现identity逻辑
把原来接口里的静态identity()方法放到工具类中,用匿名内部类实现Function接口:
public class FunctionUtils { public static <T> Function<T, T> identity() { return new Function<T, T>() { @Override public T apply(T t) { // 和Lambda的t->t逻辑完全一致,返回输入参数本身 return t; } }; } }
3. 使用示例
逻辑和Java 8版本一致,只是调用方式换成工具类的静态方法:
List<String> names = Arrays.asList("Alice", "Bob"); List<String> sameNames = new ArrayList<String>(); // 模拟Java 8 Stream的map逻辑(Java 7没有Stream,用循环演示) for (String name : names) { sameNames.add(FunctionUtils.<String>identity().apply(name)); }
这样就完全实现了Java 8版本的功能,只是写法上更繁琐——毕竟没有Lambda的语法糖简化代码~
内容的提问来源于stack exchange,提问作者Pradeep Kumar Kushwaha
相关产品推荐
相关产品推荐

