Java: lambda表达式

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);
}

猜你喜欢

转载自blog.csdn.net/baidu_25104885/article/details/85236694