【有书共读】Java攻略 读书笔记05

函数式接口

函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。函数式接口可以被隐式转换为 lambda 表达式。

在java 8之前,接口中所有方法被默认为抽象方法,不需要为它们添加abstract。java 8引入的函数式接口是一种包含单一抽象方法的接口,因此可以作为lambda表达式或方法引用的目标。
@FunctionalInterface
public interface PalindromeChecker {
    boolean isPalidrome(String s);
}

由于PalindromeChecker仅包含一个抽象方法,属于函数式接口。

@FunctionalInterface并非必需,但是基于以下两个原因,所以一般都要写上

  1. @FunctionalInterface会触发编译时校验,有助于检查确保接口符合要,如果接口不包含或包含多个抽象方法,程序将提示编译错误

  2. 其次,添加@FunctionalInterface注解后,会在javadoc中生成以下语句:

    Functional Interface:

    This is a functional interface and can therefore be used as the assignment target for a lambda expression or method reference.

函数式接口中同样可以使用default和static方法。

  1. 函数式接口里允许定义默认方法:因为默认方法不是抽象方法,其有一个默认实现,所以是符合函数式接口的定义的;

  1. 函数式接口里是可以包含静态方法:因为静态方法不能是抽象方法,是一个已经实现了的方法,所以是符合函数式接口的定义的;

  1. 函数式接口里允许定义 java.lang.Object 里的 public 方法:这些方法对于函数式接口来说,不被当成是抽象方法(虽然它们是抽象方法);因为任何一个函数式接口的实现,默认都继承了 Object 类,包含了来自 java.lang.Object 里对这些抽象方法的实现;

如下例子:
@FunctionalInterface
public interface MyInterface {
    //单一抽象方法
    int myMethod();
    //int myOtherMethod();
    //如果这句未被注释掉,MyInterface将不再是函数式接口
    
    //函数式接口里允许定义默认方法
    default String sayHello() {
        return "Hello world!";
    };
        
    //函数式接口里是可以包含静态方法
    static void myStaticMethod() {
        System.out.println("I'm a static method in an interface");
    } 
    @Override 
    //函数式接口里允许定义 java.lang.Object 里的 public 方法
    //equals方法来自object类,因此已有一个默认的实现
    boolean equals(Object obj);
}
接口可以继承其他接口(甚至不止一个)。@FunctionalInterface注解将对当前接口进行校验,因此,如果一个接口继承现有的函数式接口后,又添加了其他的抽象方法,该接口就不再是函数式接口。
public interface MyChildInterface extends MyInterface {
    int anotherMethod();//其他抽象方法
}
MyChildInterface不属于函数式接口,因为它包含了两个抽象方法,继承自MyInterface的myMetho和声明的anothoerMethod。即便没有添加@FunctionalInterface注解,代码也可以编译,因为MyChildInterface就是一个标准接口,但无法作为lambda表达式的目标。
#Java##笔记##读书笔记#
全部评论

相关推荐

狸猫换offer:神通广大的互联网
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务