1 lambda表达式概述
(1)lambda表达式是jdk1.8出来的一个重量级的改进,在使用接口实现类进行参数传递和局部变量赋值时,可用通过lambda表达式替换接口(只有一个抽象方法)的实现类,简化代码的编写,减少类的个数。
(2)lambda表达式作用
java是一种面向对象的语言,所以方法是不能独立存在的,必须被类所包含;这样会造成一个问题,就是在使用接口作为参数传递的时候,使用者的目的是为了使用接口中的方法,但是却必须创建接口的实现类,将实现类当做参数进行传递,使代码编写变得复杂,lambda表达式则突破这个局限性,可以直接将方法当成参数传递;但是使用lambda表达式替换接口的局限性是接口中只能有一个抽象方法。
2 lambda表达式使用
(1)lambda表达式的格式:(参数1,参数2,...)->{代码...}(由参数和方法体组成,类似没有方法名的方法)
//对数组的排序,使用lambda表达式传递外部比较器方法
Arrays.sort(array, (Person a, Person b) ‐> {
//lambda表达式的代码
return a.getAge() ‐ b.getAge();
});
/******************************************************************/
//对比:不使用lambda表达式的写法
// 外部比较器接口实现
Comparator<Person> comp = new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {
return o1.getAge() ‐ o2.getAge();
}
};
//比较器接口实现类作为参数传递
Arrays.sort(array, comp); // 第二个参数为排序规则,即Comparator接口实例
(2)lambda表达式的简化
1)当小括号中的参数类型可以省略
2)小括号中的参数只有一个的时候,可以省略小括号
3)大括号中的代码部分只有一个语句的时候,可以省略返回值,大括号,封号(注意:要省略必须同时省略)
//未省略写法
Arrays.sort(array, (Person a, Person b) ‐> {
return a.getAge() ‐ b.getAge();
});
//省略写法
Arrays.sort(array, (a, b) ‐> a.getAge() ‐ b.getAge());
3 lambda表达式的使用条件
(1)lambda表达式只能用来替换接口的实现类,并且接口中只能有一个抽象方法;
(2)lambda必须有上下文推断:作为方法参数和传递给局部变量,必须有lambda所替换的接口对应的类型。
4 函数式接口
(1)函数式接口:只有一个抽象方法的接口;使用函数式接口作为参数或其实现类传递给某个引用时,可以使用lambda表达式进行代替,以简化写法,提高效率;函数式接口使用@FunctionInterface注解进行修饰,保证接口在定义时只有一个抽象方法。
(2)常用函数式接口
JDK中提供了丰富的函数式接口,用来丰富Lambda表达式的使用场景,在java.util.function包中被提供
1)Supplier接口
提供了一个 T get()抽象方法,该接口的作用是用来产生所指定泛型的对象数据,例如要产生一个带有5个0-100随机数的ArrayList集合,可以使用该方法来产生;
2)Consumer接口
1)提供了一个void accept(T) 用来消费一个数据,例如传入一个数据,将其以不同的形式打印在控制台;
2)提供了andThen方法,用来将两个Consumer对象级联起来执行,例如one.andThen(two).accept("Hello");就是先执行one的accept方法,再执行two的accept方法
3)Predicate接口
1)提供了boolean test(T t)用来对某种数据类型机型判断,返回boolean值,例如判断一个字符串中是否包含某个子串,字符串中的内容是否符合一些指定的规则;
2)提供了三个默认方法 and or negate
1)and方法,将两个Predicate接口的执行结果进行与逻辑后输出结果,例如
boolean isValid = one.and(two).test("Helloworld");one和two的test方法结果与运算后输出结果
2)or方法,将两个Predicate接口的执行结果进行或逻辑后出处结果;
3)negate方法:将Predicate接口的执行结果进行取反后输出结果;
4)Function接口
1)提供apply()方法,进行类型的转换,例如将一个整型转换为字符串类型;
2)andThen():将两个接口进行级联执行,先进行第一次转换,将第一个转换结果作为第二个转换的参数进行转换;
例如int num = one.andThen(two).apply("10");先执行one结果的方法,使用参数“10”,然后将结果作为two接口的参数进行转换;