Java函数式接口@FunctionalInterface
前言
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版权协议,转载请附上原文出处链接和本声明。