public class Java8Tester {
public static void main(String args[]) {
final int num = 1;
Converter<Integer, String> s = (param) -> System.out.println(String.valueOf(param + num));
s.convert(2); // 输出结果为 3
}

public interface Converter<T1, T2> {
void convert(int i);
}
}

定义泛型接口 Converter<T1, T2>

public interface Converter<T1, T2> {
void convert(int i);
}

这是一个泛型接口,定义了一个抽象方法 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 表达式访问外部作用域的变量,但这些变量必须是不可变的。