lambda表达式
- lambda表达式是一个传递到某个对象或方法的代码块,可以在以后执行一次或多次。
- lambda表达式形式:
参数 箭头(->)一个表达式或{多行代码}
没有参数要写空括号()
例如:
(String first, String second) -> first.length() - second.length();
(String first, String second) -> {
if (first.length() < second.length()) return -1;
else if (first.length() > second.length()) return 1;
else return 0;
}
函数式接口
- 对于只有一个抽象方法的函数式接口,需要这种接口的对象时,就可以提供一个lambda表达式
例如:
Arrays.sort(words, (first, second) -> first.length() - second.length());
Arrays.sort方法第二个参数需要Comparator实例,Comparator是只有一个方法的接口,可以使用lambda表达式转换为函数式接口。
再例如lambda转换为ActionListener接口
Timer t = new Timer(1000, event -> {
System.out.println("The time is " + new Date());
});
变量作用域
- lambda表达式可以捕获外围作用域的变量,该变量应为最终变量,表达式内不能改变变量。
- lambda表达式中的this关键字,指表达式所在方法的this参数。
例如:
public class A() {
public void init() {
ActionListener listener = event -> {
System.out.println(this.toString());
}
}
}
this.toString()调用A对象的toString()
处理lambda表达式
lambda表达式的重点是延迟执行
应用于:
- 一个单独的线程中运行代码
- 多次运行代码
- 在算法的适当位置运行(如排序的比较操作)
- 发生某种情况时执行代码(如点击按钮,数据到达)
- 只在必要时运行
若想要重复一个动作20次,写一个repeat方法
repeat(20, () -> System.out.println("Hello, World!"));
要接受这个lamba表达式,需要选择一个函数式接口,这里可以使用Runnable
public static void repeat(int n, Runnable action) {
for (int i = 0; i < n; i++) action.run();
}
更复杂点
repeat(20, i - > System.out.println("Countdown: " + (19 - i)));
public static void repeat(int n, IntConsumer action) {
for (int i = 0; i < n; i++) action.accept(i);
}