今天我就来讲讲JDK8特性之函数式接口,如有不当之处,请指正。
(1)函数式接口的概念:
函数式接口是在jdk1.8提出来的一个概念,在java中指的是:有且仅有一个抽象方法的接口,这个接口就叫做函数式接口。
当然也可以包含其他方法,比如默认的,静态的,私有的,这些是可以的。千万要注意的是:抽象方法只有一个。
函数式接口适用场景:他适用于函数式编程场景的接口,在java中,函数式编程体现就是Lambda,所以函数式接口就是可以适用于
Lambda使用的接口,只有确保接口中有且仅有一个抽象方法,java中的Lambda才能顺利地进行推导。
不明白Lambda的可以看看菜鸟教程
https://www.runoob.com/java/java8-lambda-expressions.html
(2):我们在来说说格式
格式:
只要确保接口中有且仅有一个抽象方法即可:
修饰符 interface 接口名称{
public abstract 返回值类型 方法名称(可选参数信息);
}
注意了,因为在java中,接口当中抽象方法的public abstract是可以省略的,所以定义一个函数式接口炒鸡简单。
我们来试着定义一个玩玩:
//函数式接口
public interface Demo1 {
//定义一个抽象方法
void method();
}
没错,上面的这一小挫代码就是函数式接口,是不是操机简单。
//@FunctionalInterface注解
/**
* 函数式接口提供了一个注解:@FunctionalInterface注解,这个注解的作用可以检测
* 接口是否是一个函数式接口 如果是:编译成功,如果不是:那么编译失败
* 编译失败大致分两种情况:第一种接口中没有抽象方法,第二种抽象方法的个数多余一个
*/
@FunctionalInterface
public interface Demo2 {
//有且只有一个抽抽象方法才能编译通过
public abstract void method();
}
(3)方法的返回值类型是一个函数式接口
如果一个方法的返回值类型是一个函数式接口,那么就可以直接返回一个Lambda表达式。
我们来写个案列:
我们就来拿Comparator接口来举个例子:
原始写法:
public class CompartoDemo {
//定义一个静态的方法,方法的返回值类型使用函数式接口Comparator
public static Comparator<String> getComparator(){
//方法的返回值类型是一个接口,那么我们可以返回这个接口的匿名内部类
return new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o2.length() - o1.length();
}
};
}
}
采用Lambda表达式写法
import java.util.Comparator;
public class CompartoDemo {
//定义一个静态的方法,方法的返回值类型使用函数式接口Comparator
public static Comparator<String> getComparator() {
//采用Lambda表达式简化写法
return (String o1,String o2)->{
return o2.length() - o1.length();
};
}
}
上面的看上去是不是很简便,但是还可以继续优化,变得更加简便
import java.util.Comparator;
public class CompartoDemo {
//定义一个静态的方法,方法的返回值类型使用函数式接口Comparator
public static Comparator<String> getComparator() {
//超级简化后的写法
return (o1,o2)->o2.length() - o1.length();
}
}
常用函数式接口介绍
JDK提供了大量的常用的函数式接口以丰富Lambda的典型使用场景,主要在java.util.function包中。
下面我们来举几个例子
java.util.function.Supplier<T>函数式接口
此接口中仅包含一个无参的方法:T get().作用是用来获取一个泛型参数指定类型的对象数据
下面我们来用代码演示下:
public class SupplierTest {
//来定义一个方法,方法的参数传递Supplier<T>接口,泛型执行String,get方法就会返回一个String
public static String getString(Supplier<String> sup){
return sup.get();
}
//来写一个方法试试
public static void main(String[] args) {
//当我们调用getString方法,方法的参数Supplier是一个函数式接口,所以可以传递Lambda表达式
String s = getString(()->"你好");
System.out.println(s);
}
}
//输出结果
E:\java\bin\java.exe "-javaagent:D:\Program Files\JetBrains\IntelliJ IDEA codec\4.1.23.Final\netty-codec-4.1.23.Final.jar com.xiaoxiao.demo02Lambda.SupplierTest
你好