Java 8 Lambda 表达式笔记
public class Java8Tester { |
定义泛型接口 Converter<T1, T2>
public interface Converter<T1, T2> { |
这是一个泛型接口,定义了一个抽象方法 convert(int i)。其中 T1 和 T2 是泛型类型参数,表示可以接受任意类型,但在这里并未直接用到泛型。
局部变量 num 的定义
final int num = 1; |
这里定义了一个 final 局部变量 num,它将被 Lambda 表达式捕获并使用。Lambda 表达式可以访问外部作用域的 final 或事实上是 final 的变量。
使用 Lambda 表达式实现接口
Converter<Integer, String> s = (param) -> System.out.println(String.valueOf(param + num)); |
这行代码使用 Lambda 表达式实现了 Converter 接口的 convert 方法:
param 是传递给 convert 方法的参数,即 convert(int i) 的参数。
num 是外部的局部变量,在 Lambda 表达式中被捕获。
param + num 的结果被转换为字符串并输出。
说明:
通过 Converter<Integer, String>,我们指定了泛型参数 T1 为 Integer,T2 为 String。尽管接口本身没有返回类型,但 Lambda 表达式内部使用了 System.out.println 输出 String。
调用 convert 方法
s.convert(2); // 输出 3 |
调用 s.convert(2),传入参数 2,在 Lambda 表达式内部,param 的值为 2,然后将 param + num(即 2 + 1)的结果 3 输出。
输出结果
3 |
Lambda 表达式中的变量捕获
Lambda 表达式可以捕获外部作用域中的变量,但这些变量必须是 final 或事实上是 final 的。即:这些变量在 Lambda 表达式内部不能被修改。
在这个例子中,num 被定义为 final,因此它可以在 Lambda 表达式中被捕获和使用。
泛型接口的作用
Converter<T1, T2> 是一个泛型接口,可以接受任意类型的输入和输出。在这个例子中,我们通过 Converter<Integer, String> 具体化了泛型参数:
T1 为 Integer,表示输入的类型为 int。
T2 为 String,虽然没有直接返回值,但 Lambda 表达式通过 System.out.println 输出了字符串结果。
通过这种泛型设计,你可以创建不同的 Converter 实现,例如:
Converter<Double, String> anotherConverter = (param) -> System.out.println("Result: " + param |
总结
- Lambda 表达式 简化了函数式接口的实现,可以更简洁地定义接口方法。
- 泛型接口 提供了灵活性,允许你为不同类型的输入和输出编写通用代码。
- 变量捕获 允许 Lambda 表达式访问外部作用域的变量,但这些变量必须是不可变的。