Lambda表达式引发的思考
今天看了尚硅谷周阳老师的视频,内容是Lambda表达式,其中还讲到了JDK1.8以后接口的一些特性,有新的收获,将其记录形成总结。
1.首先,先定义一个接口
interface MyInterface{ public void hello(); }
2.然后在主方法中,new一个接口出来,并实现其中的方法。
public class LambdaTest { public static void main(String[] args) { MyInterface myInterface = new MyInterface() { @Override public void hello() { System.out.println("hello"); } }; myInterface.hello(); } }
没想到编译器不会报错,而是会正常执行。我以前一直认为接口是不能被实例化的,其实是可以的,这是基于一种匿名实现类的机制。
3.现在用lambda表达式修改接口的实现。记住一个口诀:括号拷贝,箭头写死,大括号写实现。
MyInterface myInterface=()->{ System.out.println("hello Lambda"); }; myInterface.hello();
4.如果在接口中,新增了一个方法hello2():
interface MyInterface{ public void hello(); public void hello2(); }
那么刚刚的lambda表达式就会报错,这是为什么呢?lambda其实是为了函数式编程,当接口中只有一个声明方法时,该接口相当于函数式接口,底层默认为该接口加了 @FunctionalInterface 注解;如果接口中出现了多个方法,那么lambda表达式将不能识别。
5.现在我们看看接口在jdk1.8后还有哪些特性
interface MyInterface{ public void hello(); default int multiply(int x,int y){ return x*y; } public static void helloStatic(){ System.out.println("helloStatic"); } }
(1)可实现default修饰的方法
(2)可以实现静态方法
以上就是我对Lambda表达式写法的总结和接口的新认识,感谢周阳老师!