1、函数式接口概述
- 函数式接口: 有且仅有一个抽象方法的接口。
- Java中的函数式编程体现就是Lambda表达式。
- 所以函数式接口即可以适用于Lambda使用的接口。
如何检测一个接口是不是函数式接口?
@FunctionalInterface
- 放在接口定义的上方:如果接口是函数式接口,编译通过;如果不是,编译失败。
package com.test8;@FunctionalInterface
public interface Inter {void show();
}
package com.test8;public class Demo {public static void main(String[] args) {Inter i=()-> System.out.println("Hello world!");i.show();}
}
注意:自定义函数式接口时,@FunctionalInterface是可选的,就算不写这个注解,只要保证满足函数式接口定义的条件,也照样是函数式接口。
2、函数式接口做为方法的参数
如果方法的参数是一个函数式接口,可以使用Lambda表达式作为参数传递。
package com.test9;public class Demo {public static void main(String[] args) {startThread(new Runnable() {@Overridepublic void run() {System.out.println(Thread.currentThread().getName()+"线程启动");}});startThread(()-> System.out.println(Thread.currentThread().getName()+"线程启动"));}private static void startThread(Runnable r){Thread t=new Thread(r);t.start();}
}
3、函数式接口作为方法的返回值
如果方法的返回值是一个函数式接口,可以使用Lambda表达式作为结果返回。
package com.test10;import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;public class Demo {public static void main(String[] args) {ArrayList<String> array=new ArrayList<String>();array.add("aa");array.add("b");array.add("cccc");array.add("ddd");System.out.println("排序前:"+array);Collections.sort(array);System.out.println("自然排序后:"+array);Collections.sort(array,getComparator());System.out.println("指定比较器排序后:"+array);}private static Comparator<String> getComparator(){ //匿名内部类方式实现
// Comparator<String> comp=new Comparator<String>() {
// @Override
//