1 为什么要学习Lambda表达式了?装B?写代码更吊?
都不是,比如你看一些源码的时候(很多源码都使用它了),有很多Lambda表达式
你又看不懂,怎么办,只有学习它,弄懂它,是吧?
为什么要用Lambda表达式了?
它使你的代码看起来更简洁,代码量更少..
其它的语言都引进了,作为第一语言的JAVA 为什么不引进了
2 Lambda表达式又叫函数式接口编程,函数式接口:顾名思义,
就是一个接口类,只有一个方法。举个简单例子:下面的线程
public static void main(String[] args) {
// JDK7 匿名内部类写法
new Thread(new Runnable(){
@Override
public void run() {
System.out.println("jdk1.7的写法");
}// 接口名
}).start();
// JDK1.8 lambda写法
new Thread(()-> System.out.println("this is my jdk 1.8 + thread")).start();
}
是不是更简单,本来要写几行代码的语句,一句就可以搞定,很炫吧。
那为什么能用Lambda表达式,其实是因为Runnable这个类,
这个接口类只有一个run()方法,并且被@FunctionalInterface(可无)注解,
下面看看有参数的Lambda,比较字符的
String[] players = {"zhansgan", "lisi", "wangwu", "zhaoliu", "wangmazi"};
// 1.1 使用匿名内部类根据 surname 排序 players
Arrays.sort(players, new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
return (s1.compareTo(s2));
}
});
Arrays.stream(players).forEach(a-> System.out.println(a));
players = new String[]{"zhansgan", "lisi", "wangwu", "zhaoliu", "wangmazi"};
// 1.2 使用 lambda 排序,根据 surname
Arrays.sort(players, (String s1, String s2) -> s1.compareTo(s2));
Arrays.stream(players).forEach(a-> System.out.println(a));
能够使用Lambda的依据是必须有相应的函数接口(函数接口,是指内部只有一个抽象方法的接口)。
通过上面例子我们再来思考为什么Lambda表达式需要函数式接口?其实很简单目的就是为来保证唯一。
你的Runnable接口只要一个抽象方法,那么我用() -> System.out.println("Hello world !"),就只能代表run方法,如果你下面还有一个抽象方法,那我使用Lambda表达式,那鬼才知道要调用哪个抽象方法呢。
你也可以写自己的函数接口,一个接口实现一个抽象方法。自己试试呗