1. 接口结合 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;
};
}
注意:并不是没有限制的! 这个接口里面只能有一个要实现的方法 !!
在接口上面加上 FunctionalInterface 注解就是告诉大家,这是个 lambda 接口,不要在里面再加其他方法了,再加就会提示报错的, 即单一责任制。
2. 默认方法(个人认为这个很重要)
注意,默认方法不属于要实现的方法!!
举例:
@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));
}
为什么我觉得默认方法在 JDK8 里面很重要的?
可以看看 List 里面的源码,在里面搜索一下 since, 你会发现,List 是在 JDK1.2 时引入的,1.2 - 1.8 版本之间都没有再往里面添加方法,只有 1.8 时才新加了如下的方法
default Spliterator<E> spliterator()
default void replaceAll(UnaryOperator<E> operator)
default void sort(Comparator<? super E> c)
为什么到 1.8 才敢加?因为之前没有默认方法,那你一加方法,其他实现了这个接口的类,都得重新改,正因为有了默认实现,所以才敢加新方法。
3. 对默认方法的覆盖
1. 定义两个相同的接口
@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. 然后写个接口继承这两个接口
@FunctionalInterface
interface Interface4 extends Interface2, Interface3 {
@Override
default int add(int x, int y) {
return 0;
}
}
可见默认方法真的很方便,很重要,很利于修改在之前版本定义好的接口,推动代码的进步.
代码地址: https://github.com/hmilyos/lambda-demo.git
网友评论