函数式接口
**函数式接口:**即适用于函数式编程场景的接口, 而java中的函数式编程提现就是lambda,所以函数式接口就是适用于Lambda使用的接口。函数式接口 有且只有一个抽象返回的接口,可以包含其他方法。
格式:
- public interface 接口名称{
- public abstract 返回值类型 方法名称(可选参数信息)
- //其他非抽象方法内容
- }
@FunctionalInterface注解
- 作用:
- 可以检测接口是否是一个函数式接口
- 是:编译成功
- 否:编译失败(接口中有多个抽象方法或者没有抽象方法)
//定义一个函数式接口
@FunctionalInterface
public interface MyFunctionalInterface {
//定义一个抽象方法
public abstract void say();
}
//函数式接口实现类
public class MyFunctionalInterfaceImpl implements MyFunctionalInterface {
//重写接口的抽象方法
@Override
public void say() {
System.out.println("使用函数式接口的实现类重写抽象方法");
}
}
/*
* 函数式接口:一般可以作为方法的的参数和返回值类型
* */
public class Demo {
//定义一个方法,参数使用函数式接口
public static void show(MyFunctionalInterface myFunctionalInterface){
//调用接口的抽象方法
myFunctionalInterface.say();
}
public static void main(String[] args) {
//传递接口的实现类对象
show(new MyFunctionalInterfaceImpl());
//传递接口的匿名内部类,重写接口的抽象方法
show(new MyFunctionalInterface() {
@Override
public void say() {
System.out.println("使用匿名内部类重写函数式接口的抽象方法");
}
});
//方法是一个函数式接口,所以可以用Lambda表达式
show(()->System.out.println("使用lambda表达式重写函数式接口的抽象方法"));
}
}
Runnable接口也是一个函数式接口。
public class DemoRunnable {
//定义一个方法,参数为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()+"线程启动了"));
}
}
函数式接口可作为方法返回值
import java.util.Arrays;
import java.util.Comparator;
public class DemoComparator {
//定义一个方法,返回值使用函数式接口Comparator
public static Comparator<String> get(){
/*return new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
//按照字符串的的长度降序排序
return o2.length()-o1.length();
}
};*/
//按照字符串的的长度降序排序
//Lambda
return (String o1, String o2)->o2.length()-o1.length();
}
public static void main(String[] args) {
String[] strings = {"aaa","bb","c","dddd"};
//输出打印前的数组
System.out.println(Arrays.toString(strings));
//调用Arrays中的sort方法,对字符串排序
Arrays.sort(strings,get());
System.out.println(Arrays.toString(strings));
}
}