概述
- Lambda表达式,也称闭包,Java8新特性之一
- Lambda表达式是一个可传递的代码块
- Lambda表达式使代码变得简洁紧凑
- 用逗号分隔的
参数列表
、–>
、函数体
三部分表示。如果代码要完成的计算无法放在一个表达式中,就可以像写方法一样,把这些代码放在 {}中, 并包含显式的 return语句。
(String first, String second) ->
{
if (first.length() < second.length()) return -1;
else if (first.length() > second.length()) return 1;
else return 0;
}
语法
(parameters参数) -> expression 表达式
或(parameters) ->{ statements声明; }
示例
- 循环遍历
public class LambdaForeach {
public static void main(String[] args) {
// 旧的遍历
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7);
for (Integer n : list) {
System.out.print(n);
}
System.out.println("\n--------");
// Lambda表达式
List<Integer> list1 = Arrays.asList(1, 2, 3, 4, 5, 6, 7);
list1.forEach(System.out::print);
}
}
结果:
1234567
1234567
- 创建线程
public class LambdaThread {
public static void main(String[] args) {
// 旧方式创建线程
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("新的线程...");
}
}).start();
// Lambda表达式创建
new Thread(() -> System.out.println("新的线程...")).start();
}
}
注意
- 即使 lambda表达式没有参数,仍然要提供空括号,就像无参数方法一样:
() -> { for (inti = 100;i >= 0;i ) System.out.println(i); }
- 如果可以推导出一个 lambda 表达式的参数类型,则可以忽略其类型。
Comparator<String> comp
= (first, second)
-> first.length() - second.length();
编译器可以推导出 first 和 second 必然是字符串,因为这个 lambda 表达式将赋 给一个字符串比较器
- 如果方法只有一个参数,而且这个参数的类型可以推导得出,那么甚至还可以省略小括号:
ActionListener listener = event ->
System.out.println("The time is " + new Date()");
- 无需指定 lambda 表达式的返回类型。lambda 表达式的返回类型总是会由上下文推导得出。
(String first, String second) -> first.length() - second.length()
上下文中需要int
结果时可以使用它