函数式接口
函数式接口:有且仅有一个抽象方法的接口
java中的函数式编程体现就是Lambda表达式,所以函数式接口就是可以适用于:ambda使用的接口。只有确保接口中有且仅有一个抽象方法,java中的Lambda才能顺利的进行推导。
如何检测一个接口是不是函数式接口呢?
@FunctionalInterface
放在接口定义的上方:如果接口是函数式接口,编译通过,如果不是,编译失败
注意
我们自己定义函数式接口的时候@FunctionalInterface是可选的,就算我不写这个注解,只要保证满足函数式接口定义的条件,也照样是函数式接口。但是,建议加上该注解
函数式接口作为方法的参数
需求
定义一个类(RunnableDemo),在类中提供两个方法
一个方法是:startThread(Runnable r) 方法参数Runnable是一个函数式接口
一个方法是主方法,在主方法中调用startThread方法
如果方法的参数是一个函数式接口,我们可以使用Lambda表达式作为参数传递
startThread(() -> System.out.println(Thread.currentThread().getName()+"线程启动了"));
package com.aynu23;// 需求
// 定义一个类(RunnableDemo),在类中提供两个方法
// 一个方法是:startThread(Runnable r) 方法参数Runnable是一个函数式接口
// 一个方法是主方法,在主方法中调用startThread方法public class RunnableDemo {public static void main(String[] args) {//在主方法中调用startThread方法//匿名内部类startThread(new Runnable() {@Overridepublic void run() {System.out.println(Thread.currentThread().getName() + "线程启动了");}});//Lambda表达式改进startThread(() -> System.out.println(Thread.currentThread().getName() + "线程启动了"));}private static void startThread(Runnable r) {
// Thread t=new Thread(r);
// t.start();new Thread(r).start();}
}
Thread-1线程启动了
Thread-0线程启动了