java8中新增加了许多特性。其中就包含lambda表达式。本文通过具体的实例来说明其用法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
// Iprint.java public interface IPrint { public void doPrint(String s); } // Print.java public class Print implements IPrint { @Override public void doPrint(String s) { System. out.println(s ); } } // Printer.java public class Printer { public void print (IPrint print ) { print.doPrint( "start print"); } } |
假设我们要调用Printer类中的print方法,一种可能的实现方式如下:
1 2 3 |
Printer p = new Printer(); // 传参实现 p.print(new Print()); |
在上面的方法中,我们通过Print类实现了IPrint接口。
当然我们还可以通过匿名类的形式去实现。
1 2 3 4 5 6 |
// 匿名实现 p.print(new IPrint() { public void doPrint(String s) { System.out.println(s); } }); |
现在我们有了第三种实现方式,就是lambda表达式。
1 2 3 4 5 6 |
// lambda 表达式 p.print((String s) -> {System. out.println(s );}); p.print(( s) -> System. out.println(s )); p.print(System. out::println); |
lambda表达式有多种形式,上面我们列举了三种。
lambda表达式的形式如下:
(参数列表)->{函数实现}。
那什么形式的接口我们能用lambda表达式实现呢?Lambda是一种SAM(single abstract method)类型,即适用于单一抽象方法的接口。在上面的例子中,IPrint接口包含一个抽象的方法doPrint,因此我们可以用lambda表达式去实现。
类似IPrint,我们称这类的接口叫函数接口,可以用@FunctionalInterface来标注。如果向@FunctionalInterface标注的接口中添加额外的抽象方法,系统会报错(如果是来自java.lang.Object的抽象方法是正确的)。