Java8新特性【上】:4大基本函数式接口、Lambda表达式、方法引用
1. Java8内置的4大核心函数式接口: Predicate,Function,Consumer,Supplier的基本使用
Predicate :给一个参数T,返回boolean类型的结果。有3个默认实现方法:and,or和negate
这三个方法对应了java的三个连接符号&&、||和!
// Predicate接口的3个默认方法实现
default Predicate<T> and(Predicate<? super T> other) {
Objects.requireNonNull(other);
return (t) -> test(t) && other.test(t);
}
default Predicate<T> negate() {
return (t) -> !test(t);
}
default Predicate<T> or(Predicate<? super T> other) {
Objects.requireNonNull(other);
return (t) -> test(t) || other.test(t);
}
/**
* 以上3个方法的测试
*/
int[] numbers= {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
List<Integer> list=new ArrayList<>();
for(int i:numbers) {
list.add(i);
}
Predicate<Integer> p1=i->i>5;
Predicate<Integer> p2=i->i<20;
Predicate<Integer> p3=i->i%2==0;
// 使用steam()方法将list转换为steam流,然后使用filter中间操作过滤,filter的参数就是一个Predicate函数式接口,最后调用终止操作collect将流转换为集合
List test=list.stream().filter(p1.and(p2).and(p3)).collect(Collectors.toList());
System.out.println(test.toString());
/** print:[6, 8, 10, 12, 14]*/
Predicate 接口的test()抽象方法的测试:
Function函数接口,与Predicate接口相似都是传入一个参数,接受一个返回值.不同的是可以返回除了boolean外的其他类型返回值,接收T对象,返回R对象
Consumer函数式接口
默认是方法addThen,使用场景:如果一个方法的参数和返回值全都是 Consumer 类型,那么就可以实现效果:消费数据的时候,首先做一个操作, 然后再做一个操作,实现组合。而这个方法就是 Consumer 接口中的default方法 andThen 。
Supplier函数式接口:接口只有一个无参的方法: T get() 。用来获取一个泛型参数指定类型的对象数据
Lambda表达式和方法引用的对比 (方法引用是Lambda表达式的语法糖)
Java8方法引用测试
> 方法引用的使用:
1.使用场景:当要传递给Lambda体的操作,已经有实现的方法了,可以使用方法引用!
2.方法引用,本质上就是Lambda表达式,而Lambda表达式作为函数式接口的实例。所以
方法引用,也是函数式接口的实例。可以认为是Lambda表达式的一个语法糖。
3. 使用格式: 类(或对象) :: 方法名
4. 具体分为如下的三种情况: 【注意,没有 对象 :: 静态方法】
* 情况1 对象 :: 非静态方法
* 情况2 类 :: 静态方法
* 情况3 类 :: 非静态方法
5. 方法引用使用的要求:要求接口中的抽象方法的形参列表和返回值类型与方法引用的方法的
形参列表和返回值类型相同!(针对于情况1和情况2)