1.Lambda允许把函数式接口作为一个方法的参数。
比如:
Runnable runnable=new Runnable(){
public void run() {
System.out.println("aaa");
}
};
new Thread(runnable).start();
runnable 就是一个函数式接口.
2.允许把函数式接口作为方法的返回值类型
比如:
// 定义一个方法,方法的返回值类型使用函数式接口Comparator
public static Comparator<String> getComparator() {
// 方法的返回值是一个接口,那么我们可以返回这个接口的匿名内部类
/*return new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
// 按照字符串的降序排序
return o2.length() - o1.length();
}
};*/
// 方法的返回值类型是一个函数式接口,所以我们可以返回一个Lambda表达式
/* return (String o1, String o2) -> {
return o2.length() - o1.length();
};*/
// 优化Lambda表达式
return (o1, o2) -> o2.length() - o1.length();
}
public static void main(String[] args) {
// 创建一个字符串数组
String[] arr = {"aaaaa", "ooooooo", "sssssssss", "llll"};
// 排序前数组
// System.out.println(Arrays.toString(arr));
// 调用Arrays中的sort方法,对字符串数组进行排序
Arrays.sort(arr, getComparator());
// 排序后的数组
System.out.println(Arrays.toString(arr));
}
这两种方式都可以自行进行定义。
3.什么是函数式接口
函数式接口 有@FunctionalInterface注解。 任何接口,如果只包含唯一一个抽象方法,那么它就是一个函数式接口。
4.常用的函数式接口
Supplier 生产型接口,指定接口泛型是什么类型,那么接口中的get 方法就会产生什么类型数据
Consumer 接口是一个消费类型接口,泛型执行什么类型,就可以使用accpet 方法消费什么类型数据
Predicate 对某种数据类型的数据进行判断,结果返回一个boolean ,抽象方法为test()。
Function 接口用来根据一个类型的数据得到另一个类型的数据, 使用抽象方法 R apply(T t)根据类型T 的参数获取类型R的结果。使用场景 例如:将String 类型转换为Intger 类型