jdk8 新特性 函数式接口介绍

135 阅读2分钟

「这是我参与11月更文挑战的第2天,活动详情查看:2021最后一次更文挑战

函数式接口

有且仅有一个抽象方法,可以有多个非抽象方法的接口

函数式接口可以隐式转换为lambda表达式.

例如Runnable 接口就是函数式接口,只有一个抽象方法

image.png

@FunctionalIntegerface

专门为创建函数式接口的注解.用来指定某个接口必须是函数式接口,只能修饰接口

作用:告诉编译器检查这个接口,保证接口只能包含一个抽象方法

// 检查是否为函数式接口(有且只有一个抽象方法)
@FunctionalInterface
public interface hssInterface {

    public abstract void test();

}

如下图,没有抽象方法时会报错,多个抽象方法也会报错.

image.png

接口的默认方法也是抽象方法 .此时有一个普通方法和被抽象修饰的方法,也报错了,说明有多个抽象方法

image.png

如何使用函数式写法

分析语法

			// 通常写法
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("1.7");
            }
        }).start();

        // 使用函数式写法
        new Thread(() -> {System.out.println("1.8");}).start();

分析上段代码,由于Runnable 接口是函数式接口(只有一个抽象方法),因此使用new Runnable() 是相当于直接重写它的抽象方法.因此可以直接使用()代替那个抽象方法(如果有参数,还是要参数对应).

new Runnable() {
            @Override
            public void run() {}   
// 可以直接写成下面 

// 如果run方法有参数,那么在下面的()中相对应即可.
() -> {} 

自己模拟

1.定义一个函数式接口

@FunctionalInterface
public interface hssInterface {
    public abstract void test();
}

2.将函数式接口作为参数带入方法

public class hssClass {
// 将函数式接口作为参数
    public  hssClass(hssInterface hss) {
        hss.test();
    }
}

3.调用该方法

方法表达流程:hssClass构造方法→hssInterface函数式接口→实现唯一的抽象方法test()

				//直接使用函数式接口成为变量
				hssInterface hssInterface = ()->{
            System.out.println();
        };				

				// 之前的写法
        new hssClass(new hssInterface() {
            @Override
            public void test() {
                System.out.println("自己尝试函数式编程");
            }
        });
        
        // 函数式接口写法
        new hssClass(() -> {
            System.out.println("自己尝试函数式编程");
        });