一、什么是lambda表达式
lambda表达式的类型是一个接口类型,而lambda表达式本身的代码就是接口的实现,即lambda表达式是一个接口的实现。对于只有一个抽象方法的接口,需要这种接口的对象时,就可以提供一个lambda表达式,这种接口又被称为函数式接口,我们可以在该接口前声明@FunctionalInterface进行注解,这样就无法添加新的接口方法。lambda表达式又被称作匿名函数,也称闭包, 和匿名内部类类似,不过比匿名内部类更为简洁,在实现事件监听和回调,往往会用lambda表达式代替匿名内部类。
二、lambda表达式的用途
1. lambda表达式可以让代码变得十分简洁
我们知道通常实现接口是通过创建一个类并实现接口,然后通过实例化该类创建对象并调用接口的方法,而通过lambda表达式直接传递对象则极为方便。并且,由于lambda表达式可以直接赋值给一个变量,这样就可以直接把表达式作为参数传给特定方法,而传统的则必须实现接口的定义才能传递。
(图片转自:https://www.zhihu.com/question/20125256)
2. 可以延迟执行(deferred execution)。
如果想要立即执行代码,这种情况是无需使用lambda表达式中,而是希望以后多次执行代码,在适当位置执行代码(Comparator),发生某种情况执行代码(event)。而要使用某些lambda表达式就得选择一个函数式接口,有常用函数式接口供选择。
java.lang.Runnable
java.util.concurrent.Callable
java.security.PrivilegedAction
java.util.Comparator
java.io.FileFilter
java.nio.file.PathMatcher
java.lang.reflect.InvocationHandler
java.beans.PropertyChangeListener
java.awt.event.ActionListener
javax.swing.event.ChangeListener
1 public interface IntConsumer { 2 void accept(int value); 3 } 4 public static void repeat(int n, i -> 5 System.out.println("Countdown:" + (9 - i))) { //IntConsumer action = i -> System.out.println("Countdown:" + (9 - i)) 6 for (int i = 0; i < n; i++) { 7 action.accept(i); 8 } 9 }
三、lambda表达式格式
(图片转自:https://www.zhihu.com/question/20125256)