JAVA中Lambda表达式初谈

时间:2022-01-18 00:44:41
Lambda表达式的语法
基本语法:
(parameters) -> expression

(parameters) ->{ statements; }
// 不需要参数,返回值为 5  
() -> 5

// 接收一个参数(数字类型),返回其2倍的值
x -> 2 * x

// 接受2个参数(数字),并返回他们的差值
(x, y) -> x – y

// 接收2个int型整数,返回他们的和
(int x, int y) -> x + y

// 接受一个 string 对象,并在控制台打印,不返回任何值(看起来像是返回void)
(String s) -> System.out.print(s)

注意:如果Lambda表达式只在某些分支返回一个值、而在另外一些分支不返回值、只是不合法的。例:

(int x)->{if (x >= 0) return 1;}

处理Lambda表达式

在Java中,对Lambda表达式所能做到的也只是能转换为函数式接口。 对于只有一个抽象方法的接口,需要这个接口对象时,就可以用一个Lambda表达式。 例如:Arrays.sort()方法,他的第二个参数需要一个Comparator实例,Comparator就是只有一个抽象方法的接口。
Arrays.sort(words, (first, second)->first.length() - second.length());
又例如在处理并发时需要一个线程对象:
Runable r = ()-> {
...
}


Lambda表达式可以捕获外围作用域中变量的值,但是只能引用这个捕获的值,而不能改变变量。
而且,Lambda表达式捕获的变量必须是最终变量(变量初始化之后就不会再为他赋新值)。 例如以下都是非法的:
int start = 10;
() -> {
start--; // 错误、只能引用值、不能改变值
System.out.println(start);
}

for (int i = 0; i < 20; i++) {
() -> {
// 错误只能捕获最终变量
System.out.println(i);
}
}