zoukankan      html  css  js  c++  java
  • 函数式接口和Lambda表达式

    函数式接口(一般标有@FunctionalInterface)就是只定义一个抽象方法的接口。

    一个接口,如果满足函数式接口的定义,那么即使不标注为 @FunctionalInterface, 编译器依然会把它看做函数式接口。

    如下是函数式接口的实例:

    public interface A {
        String sayHi();
    }
    
     interface B {
        void sayHey();
    }
     
    interface C {
        default void helloWorld() {
        System.out.println("HelloWorld");
        }
         void sayHello();
     }
    
    interface D {
        default void helloWorld() {
        System.out.println("HelloWorld");
        }
        default String helloWorld2() {
        return "HelloWorld";
        }
         void sayNothing();
     }
    
    @FunctionalInterface
    interface E {
        void handle(int i);
        //此处的boolean equals(Object obj);方法不是抽象方法,因为相同的方法已在java.lang.Object 实现
        //任何被java.lang.Object实现的方法,都不能视为抽象方法
        boolean equals(Object obj);
    }

    Lambda表达式用在函数式接口出现的地方:

    Lamda 表达式允许你直接以内联的形式为函数式接口的抽象方法提供实现,
    并把整个表达式作为函数式接口的实例(具体来说,是函数函数式接口一个具体实现的实例。)

    如下是Lambda 为Runnable 函数式接口的抽象方法run 提供实现的例子:

    /**
     * Lamda 表达式允许你直接以内联的形式为函数式接口的抽象方法提供实现,
     * 并把整个表达式作为函数式接口的实例(具体来说,是函数函数式接口一个具体实现的实例。)
     * 
     * 如下所示,使用lambda表达式可以简化匿名类的编写。
     * 
     * 
     * Runnable 是一个函数式接口
     * @FunctionalInterface
     *  public interface Runnable {
     *      public abstract void run(); 
     *    }
     *
     */
    public class LambdaDemo {
    
        public static void main(String[] args) {
    
        // 使用Lambda
        Runnable r1 = () -> System.out.println("Hello World 1");
    
        // 使用匿名类
        Runnable r2 = new Runnable() {
    
            @Override
            public void run() {
            System.out.println("Hello World 2");
            }
        };
    
        process(r1);
    
        process(r2);
    
        process(() -> System.out.println("Hello World 3"));
    
        }
    
        public static void process(Runnable r) {
        r.run();
        }
    
    }
  • 相关阅读:
    说说与线程相关的方法
    sleep()和yield()有什么区别?
    同步和异步有何异同,分别在什么情况下使用?
    如何保证多个线程同时启动?
    volatile关键字能否保证线程安全?
    使用对象的wait()方法需要注意什么?
    乐观锁与悲观锁是什么?
    Condition实现等待、唤醒
    LongAdder与AtomicLong有什么区别?
    介绍一下ForkJoinPool的使用
  • 原文地址:https://www.cnblogs.com/luffystory/p/11969683.html
Copyright © 2011-2022 走看看