1. 接口結(jié)合 lambda
1. 先定義接口
@FunctionalInterface
interface Interface1{
int doubleNum(int i);
}
2. 使用方法
public static void method1() {
Interface1 i1 = (i) -> i * 2;
Interface1 i2 = i -> i * 2; // 最常見的寫法
Interface1 i3 = (int i) -> i * 2;
Interface1 i4 = (i) -> {
System.out.println("--------");
return i * 2;
};
}
注意:并不是沒(méi)有限制的! 這個(gè)接口里面只能有一個(gè)要實(shí)現(xiàn)的方法 ?。?/strong>
在接口上面加上 FunctionalInterface 注解就是告訴大家,這是個(gè) lambda 接口,不要在里面再加其他方法了,再加就會(huì)提示報(bào)錯(cuò)的, 即單一責(zé)任制。
2. 默認(rèn)方法(個(gè)人認(rèn)為這個(gè)很重要)
注意,默認(rèn)方法不屬于要實(shí)現(xiàn)的方法!!
舉例:
@FunctionalInterface
interface Interface2{
int doubleNum(int i);
default int add(int x, int y){
return x + y;
}
}
使用:
public static void method2() {
Interface2 i2 = i -> i * 2;
System.out.println(i2.doubleNum(10));
System.out.println(i2.add(3, 4));
}
為什么我覺得默認(rèn)方法在 JDK8 里面很重要的?
可以看看 List 里面的源碼,在里面搜索一下 since, 你會(huì)發(fā)現(xiàn),List 是在 JDK1.2 時(shí)引入的,1.2 - 1.8 版本之間都沒(méi)有再往里面添加方法,只有 1.8 時(shí)才新加了如下的方法
default Spliterator<E> spliterator()
default void replaceAll(UnaryOperator<E> operator)
default void sort(Comparator<? super E> c)
為什么到 1.8 才敢加?因?yàn)橹皼](méi)有默認(rèn)方法,那你一加方法,其他實(shí)現(xiàn)了這個(gè)接口的類,都得重新改,正因?yàn)橛辛四J(rèn)實(shí)現(xiàn),所以才敢加新方法。
3. 對(duì)默認(rèn)方法的覆蓋
1. 定義兩個(gè)相同的接口
@FunctionalInterface
interface Interface2{
int doubleNum(int i);
default int add(int x, int y){
return x + y;
}
}
@FunctionalInterface
interface Interface3{
int doubleNum(int i);
default int add(int x, int y){
return x * y;
}
}
2. 然后寫個(gè)接口繼承這兩個(gè)接口
@FunctionalInterface
interface Interface4 extends Interface2, Interface3 {
@Override
default int add(int x, int y) {
return 0;
}
}
可見默認(rèn)方法真的很方便,很重要,很利于修改在之前版本定義好的接口,推動(dòng)代碼的進(jìn)步.
代碼地址: https://github.com/hmilyos/lambda-demo.git