Java函数式接口的执行流程


前言

JDK1.8新特性推出了函数式接口,下面以Runnable举例来说明它的执行流程,希望能帮助大家正确理解函数式接口。

一、先搞明白什么是函数式接口?

函数式接口是指只有一个抽象方法的接口(当前这里不包括默认方法和接口静态方法)。可以使用@FunctionalInterface 这个注解,正式的声明,但也可以省略。针对有多个抽象方法的接口,使用@FunctionalInterface 标注或采用Lambda调用时会报错。

二、Runnable调用流程解析

1.示例代码

代码如下(示例):

/**
 * 先说明一点 -> 这个读作 goes to  
 * 意义就是 ()这个就是参数列 -> goes to 带到{去执行}
 */
public class TestThread implements Runnable {

    public TestThread(boolean flag) {
        this.flag = flag;
    }

    public TestThread() {
        System.out.println("无参构造执行");
    }

    public boolean flag = true;

    @Override
    public void run() {
        this.add(flag);
    }

    void add(boolean flag) {
        if (flag) {
            System.out.println("true业务逻辑");
        } else {
            System.out.println("false业务逻辑");
        }
    }

    public static void main(String[] args) {
        /**
         * 传统调用方法
         */
        Runnable r1 = new TestThread();
        //lambda语法调用
        /**
         * 这种写法相当于代码块中只调用了TestThread的无参构造方法,
         * 而不是真实的去创建对象,大家千万不要误解这种写法
         */
        Runnable r2 = TestThread::new;
        /**
         * -> 后面只有一行代码 {} 可以省略
         */
        Runnable r3 = () -> new TestThread().run();
        /**
         *  -> 多行代码块 {}包裹
         */
        Runnable r4 = () -> {
            Runnable r5 = new TestThread(true);
            r5.run();
        };
        //传统写法直接调用
        r1.run();
        //这里肯定只是调用无参构造方法,而无法调用run
        r2.run();
        //下面两个在调用run方法时,才执行 ->后的 {}代码
        r3.run();
        r4.run();
    }
}

2.核心真谛

上面的代码示例已经写的很清楚了,大家可以copy到本地去认真体会,这里的核心真谛就是调用接口的run 方法时,实际上时执行->后面的代码块。


版权声明:本文为weixin_39162597原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。