What? |
我们首先来解决是什么的问题
中学的时候我们学过y=kx+1,而这个表达式也可以表示为f(x)=kx+1,f(x)就可以表示这个函数
来,我们举一个case
基础版 |
首先定义一个接口
interface Cat{ public void shout(); }
我们原来的写法,如果有一个接口,那么需要先写一个实现类
class BlackCat implements Cat{ @Override public void shout() { System.out.println("喵喵喵……"); } }
然后编写main方法
public class Demo01{ public static void main(String[] args) { Cat cat= new BlackCat(); cat.shout(); } }
运行输出
"C:\Program Files\Java\jdk1.8.0_162\bin\java.exe"… 喵喵喵…… Process finished with exit code 0
分析:这种方式还需要新建一个实现类,比较麻烦
中级版 |
java提供了一种匿名类内部类的方法,使用匿名内部类之后,就不需要新建类了
class Animal{ public static void main(String[] args){ Cat cat=new Cat() { @Override public void shout() { System.out.println("喵喵喵……"); } }; cat.shout(); } }
运行输出
"C:\Program Files\Java\jdk1.8.0_162\bin\java.exe"… 喵喵喵…… Process finished with exit code 0
分析:使用匿名内部类不需要再新建类了,那么什么是匿名内部类呢?
高级版Lambda Express |
第二种匿名内部类虽然不用新建类了,但是代码长度还是很长,java 8为了解决解决匿名内部类冗余,就出现了Lambda Express
class Animal{ public static void main(String[] args){ Cat cat=()->{System.out.println("喵喵喵……")}; cat.shout(); } }
运行输出
"C:\Program Files\Java\jdk1.8.0_162\bin\java.exe"… 喵喵喵…… Process finished with exit code 0
分析:此时的代码是不是很简洁呢?这就是lambda表达式的魅力所在了,写成这种方式我学习了网上一
个老师的小口诀:拷贝中括号,写死右箭头,落地花括号 简单点说就是,复制接口的小括号在实例化对象的等号的后面,然后写上->,最后写上花括号{},而花括号{}中就是写具体的实现了,感觉老师总结的
很好。此时的()和最开始提到的f()是一个道理。小括号()就代表了接口中的一个方法,应该会有人疑惑
()是接口中的哪个方法呢?我们是无法得知的,所以,想要用lambda表达式 接口中只能有一个普通方
法,符号“()->{}”就表示创建了一个匿名内部类,小括号()中没有参数,表示该方法无参。
扩展:函数式接口 |
如下,当接口上有@FunctionalInterface 注解时,表示此接口是一个函数式接口, 函数式接口只有一个普通方法,当写两个方法的时候就会报错。
函数式接口
@FunctionalInterface interface Cat{ public void shout(); }
写两个,就会报错
那么函数式接口中是不是只能写一个方法呢?这样接口就会受到限制。而强大的Java为我们解决了这个问题。
第一种:default方法
可以使用default,来设置该函数式接口的默认函数,可以写上实现,default只能有一个
@FunctionalInterface interface Cat{ public default void shout(){ System.out.println("喵喵喵……"); }; public void eat(); }
第二种:static方法
static方法可以写多个,调用时直接使用类名+“.”即可
@FunctionalInterface interface Cat{ public static void ok(){ System.out.println("喵喵喵……"); }; public default void shout(){ System.out.println("喵喵喵……"); }; public void eat(); }
总结 |
lambda表达式的目的就是解决匿名内部类冗余,减少代码,但是函数式接口只能有一个普通方法限制了接口的功能,接下来的静态方法static和默认方法default解决了这个问题,所以lambda表达式是非常强大的,同时,从这次的学习我们发现面向函数编程是必须要掌握的。