Java高级学习-函数式接口
函数式接口:有且仅有一个抽象方法的接口
函数式编程:Lambda,函数式接口就是适用于Lambda使用的接口
语法糖:更加方便,但是原理不变的代码语法,for-each–底层式迭代器。
为了确保是函数式接口,使用注解:@FunctionalInterface
使用:一般作为方法的参数和返回值类型。
方法的参数是一个接口,可以传递接口的实现类对象
void show( MInterface in ){ }
show(new MyInterfaceImpl() );
方法的参数是一个接口,可以传递接口的匿名内部类
show( new MInterface() { } )
方法的参数是一个接口,可以使用lambda表达式
show( ( ) -> { 重写接口抽象方法 } )
函数式编程
使用lambda优化性能浪费,lambda特点:延迟加载,使用前提必须存在函数式接口。
方法的参数是一个函数式接口,使用lambda进行参数传递。
只有满足前提条件,才进行使用lamdba表达式作为参数传递。
使用Lambda方法的参数和返回值类型
参数:对函数式接口Runnable,假设由一个方法使用该接口作为参数,那么可以使用Lambda进行传参。
返回值:方法返回值类型为函数式接口,可以直接返回一个Lambda表达式
常用的函数式接口
java.util.function
Supplier接口
java.util.function.Supplier 生产型接口,仅包含一个无参方法:T get( )。用来获取一个泛型参数指定类型的对象数据。
public static int getMax(Supplier sup){ return sup.get() ; }
int[] arr = {1 , 2 , 3, 4 };
int a = getMax( () -> { int max = arr[0]; for ( int i : arr) { if (xxx) return xxx; } } )
Consumer接口
java.util.function.Consumer 消费型接口,消费数据。
抽象方法为:void accept(T t),消费一个指定泛型的数据。
默认方法:andThen:一步接一步,将两个操作组合,将两个Consumer接口组合到一起。
Consumer con1; Consumer con2;
String s = “XXX”;
con1.andThen(con2).accept(s); == { con1.accept(s); con2.accept(s); }
Predicate接口
进行判断,返回一个boolean结果
抽象方法 boolean test( T t):用来对指定数据类型数据进行判断的方法。是否满足事码条件,在lambda表达式里面重写抽象方法test()
可以用于判断过滤数组字符信息
默认方法:
and –
return pre1.and(pre2).test(s); // == return pre1.test(s) && pre2.test(s);
源码:
default Predicate<T> and ( Predicate<? super T> other){//泛型的下限:只能接受该类型及其父类:? super E
objects.requireNonNull(other);
return (t) -> this.test(t) && other.test(t);
}
- 1
- 2
- 3
- 4
or
源码:
default Predicate<T> or ( Predicate<? super T> other){//泛型的下限:只能接受该类型及其父类:? super E
objects.requireNonNull(other);
return (t) -> this.test(t) || other.test(t);
}
- 1
- 2
- 3
- 4
negate:取反
源码:
default Predicate<T> negate() { return (t) -> !test(t); }
- 1
Function接口
java.util.function.Function<T, R> 根据一个类型的数据得到另一个类型的数据。转换。
抽象方法:apply
R apply(T t)
默认方法:andThen:组合操作
Printalbe接口
对字符串进行打印
文章来源: blog.csdn.net,作者:αβγθ,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/weixin_38022166/article/details/115538517
- 点赞
- 收藏
- 关注作者
评论(0)