美文网首页
@FunctionalInterface、Lambda表达式

@FunctionalInterface、Lambda表达式

作者: salix_ | 来源:发表于2020-02-11 13:50 被阅读0次

    本文内容:

    • 一:Lambda
    • 二:@FunctionalInterface

    一:Lambda

    1:使用的条件

    只有@FunctionalInterface(SAM接口才可以),看第二部分@FunctionalInterface(SAM接口)。

    2:使用的方法(直接看下面3举的例子吧)
    image.png
    注意:

    Lambda返回的是接口的实例对象
    有没有参数、参数有多少个、需不需要有返回值、返回值的类型是什么---->选择自己合适的函数式接口

    3:举一个最常见的例子(创建线程并重写run方法)

    首先我们看Runnable接口其实也是一个函数式接口,上源代码,看到@FunctionalInterface了吧。并且Runnable接口里面只有一个无参的run方法


    image.png

    比如说我想开启一个线程输出“hello salix”,我就可以


    image.png

    4:可不可以对于一个小函数(无关接口啥的),我们可不可以写成Lambda表达式的形式,然后直接调用呢?当然可以!

    例:Consumer是一个入参,无返回值,我们可以这样使用(consumer.accept就相当于一个小函数)


    image.png

    剩下的你可以自己查,给你个表:


    image.png

    二:@FunctionalInterface(SAM接口)

    1.什么是函数式接口

    所谓的函数式接口,当然首先是一个接口,然后就是在这个接口里面只能有一个抽象方法。
    这种类型的接口也称为SAM接口,即Single Abstract Method interfaces

    2.特点

    接口有且仅有一个抽象方法
    下面的方法不算抽象方法,尤其注意第三个

    • 允许定义静态方法
    • 允许定义默认方法
    • 允许java.lang.Object中的public方法
    • . 该注解不是必须的,如果一个接口符合"函数式接口"定义,那么加不加该注解都没有影响。加上该注解能够更好地让编译器进行检查。如果编写的不是函数式接口,但是加上了@FunctionInterface,那么编译器会报错
      例子
      // 正确的函数式接口

    如果接口声明了一个覆盖java.lang.Object的全局方法之一的抽象方法,那么它不会计入接口的抽象方法数量中,因为接口的任何实现都将具有java.lang.Object或其他地方的实现。

    @FunctionalInterface
    public interface TestInterface {
        // 抽象方法
        public void sub(); 
        // java.lang.Object中的public方法
        public boolean equals(Object var1) 
        // 默认方法
        public default void defaultMethod(){
        }
        // 静态方法
        public static void staticMethod(){
     
        }
    }
    

    // 错误的函数式接口(有多个抽象方法)

    @FunctionalInterface
    public interface TestInterface2 {
        void add();
        void sub();
    }
    
    3.我发现Comparator也是一个函数式接口,可以自己打开源代码瞧一瞧。

    相关文章

      网友评论

          本文标题:@FunctionalInterface、Lambda表达式

          本文链接:https://www.haomeiwen.com/subject/oixxfhtx.html