public static void main(String[] args) { int n1 = 10; int n2 = 5; // 打印加法计算结果 display((a, b) -> { return a + b; }, n1, n2); // 打印减法计算结果 display((a, b) -> a - b, n1, n2); } /** * 打印计算结果 * * @param calc Lambda表达式 * @param n1 操作数1 * @param n2 操作数2 */ public static void display(Calculable calc, int n1, int n2) { System.out.println(calc.calculateInt(n1, n2)); }上述代码第 19 行定义 display 打印计算结果方法,其中参数 calc 类型是 Calculable,这个参数即可以接收实现 Calculable 接口的对象,也可以接收 Lambda 表达式,因为 Calculable 是函数式接口。 代码第 7 行和第 9 行两次调用 display 方法,它们第一个参数都是 Lambda 表达式。
public class LambdaDemo { // 实例成员变量 private int value = 10; // 静态成员变量 private static int staticValue = 5; // 静态方法,进行加法运算 public static Calculable add() { Calculable result = (int a, int b) -> { // 访问静态成员变量,不能访问实例成员变量 staticValue++; int c = a + b + staticValue; // this.value; return c; }; return result; } // 实例方法,进行减法运算 public Calculable sub() { Calculable result = (int a, int b) -> { // 访问静态成员变量和实例成员变量 staticValue++; this.value++; int c = a - b - staticValue - this.value; return c; }; return result; } }LambdaDemo 类中声明一个实例成员变量 value 和一个静态成员变量 staticValue。此外,还声明了静态方法 add(见代码第 8 行)和实例方法 sub(见代码第 20 行)。add 方法是静态方法,静态方法中不能访问实例成员变量,所以代码第 13 行的 Lambda 表达式中也不能访问实例成员变量,也不能访问实例成员方法。
public class LambdaDemo { // 实例成员变量 private int value = 10; // 静态成员变量 private static int staticValue = 5; // 静态方法,进行加法运算 public static Calculable add() { // 局部变量 int localValue = 20; Calculable result = (int a, int b) -> { // localValue++; // 编译错误 int c = a + b + localValue; return c; }; return result; } // 实例方法,进行减法运算 public Calculable sub() { // final局部变量 final int localValue = 20; Calculable result = (int a, int b) -> { int c = a - b - staticValue - this.value; // localValue = c; // 编译错误 return c; }; return result; } }上述代码第 10 行和第 23 行都声明一个局部变量 localValue,Lambda 表达式中访问这个变量,如代码第 14 行和第 25 行。不管这个变量是否显式地使用 final 修饰,它都不能在 Lambda 表达式中修改变量,所以代码第 12 行和第 26 行如果去掉注释会发生编译错误。
::
运算符,该运算符用于“方法引用”,注意不是调用方法。“方法引用”虽然没有直接使用 Lambda 表达式,但也与 Lambda 表达式有关,与函数式接口有关。 方法引用的语法格式如下:ObjectRef::methodName
其中,ObjectRef 是类名或者实例名,methodName 是相应的方法名。public class LambdaDemo { // 静态方法,进行加法运算 // 参数列表要与函数式接口方法calculateInt(int a, int b)兼容 public static int add(int a, int b) { return a + b; } // 实例方法,进行减法运算 // 参数列表要与函数式接口方法calculateInt(int a, int b)兼容 public int sub(int a, int b) { return a - b; } }LambdaDemo 类中提供了一个静态方法 add,一个实例方法 sub。这两个方法必须与函数式接口方法参数列表一致,方法返回值类型也要保持一致。
public class HelloWorld { public static void main(String[] args) { int n1 = 10; int n2 = 5; // 打印加法计算结果 display(LambdaDemo::add, n1, n2); LambdaDemo d = new LambdaDemo(); // 打印减法计算结果 display(d::sub, n1, n2); } /** * 打印计算结果 * * @param calc Lambda表达式 * @param n1 操作数1 * @param n2 操作数2 */ public static void display(Calculable calc, int n1, int n2) { System.out.println(calc.calculateInt(n1, n2)); } }代码第 18 行声明 display 方法,第一个参数 calc 是 Calculable 类型,它可以接受三种对象:Calculable 实现对象、Lambda 表达式和方法引用。代码第 6 行中第一个实际参数
LambdaDemo::add
是静态方法的方法引用。代码第 9 行中第一个实际参数d::sub
,是实例方法的方法引用,d 是 LambdaDemo 实例。LambdaDemo::add
和第 9 行的d::sub
是方法引用,此时并没有调用方法,只是将引用传递给 display 方法,在 display 方法中才真正调用方法。
本文链接:http://task.lmcjl.com/news/10696.html