2. JDK 8 接口新特性

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

猜你喜欢

转载自blog.csdn.net/weixin_34144450/article/details/87534078