概念:
有且仅有一个抽象方法的接口,称之为函数式接口 一般可以作为方法的参数和返回值类型
<1>定义一个函数式接口
package Demo35;
@FunctionalInterface public interface Demo01MyFunctionalInterface {
public abstract void method();
}
<2>接口实现类,重写抽象方法
package Demo35; public class Demo01MyFunctionalInterfaceImpl implements Demo01MyFunctionalInterface{ @Override public void method(){} }
<3>使用函数式接口
package Demo35; public class Demo02 { //参数是函数式接口 public static void show(Demo01MyFunctionalInterface myInter){ myInter.method(); } public static void main(String[] args) { //函数是接口的使用有三种 //可以传递接口的实现类对象 show(new Demo01MyFunctionalInterfaceImpl()); //可以传递接口的匿名内部类,里面重写抽象方法 show(new Demo01MyFunctionalInterface() { @Override public void method() { System.out.println("使用匿名内部类重写接口中的抽象方法"); } }); //可以使用Lambda表达式 show(() -> { System.out.println("使用lambda表达式重写接口中的抽象方法"); }); //简化lambda表达式 show(() -> System.out.println("使用lambda表达式重写接口中的抽象方法")); } }
此外,java.lang.Runnable 接口本身就是一个函数式接口。
package Demo37; public class Demo01Runnable { //定义一个方法创建线程,方法的参数使用函数式接口Runnable public static void startThread(Runnable run){ new Thread(run).start(); } public static void main(String[] args) { startThread(new Runnable() { @Override public void run() { System.out.println(Thread.currentThread().getName()+"--->"+"线程启动了"); } }); //使用lambda表达式 startThread(()->{ System.out.println(Thread.currentThread().getName()+"--->"+"线程启动了"); }); //使用简化的lambda表达式 startThread(() -> System.out.println(Thread.currentThread().getName()+"--->"+"线程启动了")); } }