JDK都出到14了,你有什么理由不会函数式编程(推荐)
函数式接口
先看一下官方定义
Functionalinterfacesprovidetargettypesforlambdaexpressionsandmethodreferences.
可以看出函数式接口主要用于lambda表达式,这类接口只定义了唯一的抽象方法的接口(除了隐含的Object对象的公共方法),一开始也称SAM类型接口(SingleAbstractMethod)。
简单使用
Listlist=Lists.newArrayList(1,2,3); list.forEach(r->{ System.out.println("re="+Math.sqrt(r)); });
看一下foreach实现,在Iterable.java中
defaultvoidforEach(Consumeraction){ Objects.requireNonNull(action); for(Tt:this){ action.accept(t); } }
这里出现的Consumer就是一个函数式接口,java8提供了一些常用的函数式接口
- Predicate--传入一个参数,返回一个bool结果,方法为booleantest(Tt)
- Consumer--传入一个参数,无返回值,纯消费。方法为voidaccept(Tt)
- Function--传入一个参数,返回一个结果,方法为Rapply(Tt)
- Supplier--无参数传入,返回一个结果,方法为Tget()
- UnaryOperator--一元操作符,继承Function,传入参数的类型和返回类型相同。
- BinaryOperator--二元操作符,传入的两个参数的类型和返回类型相同,继承BiFunction
这里就不一一列举了,具体请见java.util.function包都很简单,不太清楚的自行google
扩展
但是jdk提供的有时候不一定能满足需求,这个时候就需要我们自定义函数式接口
1.普通的Function或者Consumer只能就收一个参数,BiFuntion和BiConsumer也只能接受连个参数,参数更多的情况就无法满足了
以consumer为例,先自定义一个接口
@FunctionalInterface publicinterfaceTriConsumer{ voidaccept(Tt,Uu,Ww); defaultTriConsumer andThen(TriConsumerafter){ Objects.requireNonNull(after); return(l,r,w)->{ accept(l,r,w); after.accept(l,r,w); }; } }
函数式接口一般使用@FunctionalInterface注解注释,以申明该接口是一个函数式接口,这里提供一个andThen方法以支持连续调用
使用方法
TriConsumerconsumer=(a,b,c)->{ System.out.println(a+b+c); }; consumer.accept(5,6,7);
funtion类似,这里就不举例了
2.异常捕获
FunctionalInterface提供的接口一般是不抛出异常的,意味着我们在使用的时候需要在方法体内部捕获异常,这里定义一种可以抛出异常的接口
@FunctionalInterface publicinterfaceInterfaceException{ voidapply(Tt)throwsException; }
总结
到此这篇关于JDK都出到14了,你有什么理由不会函数式编程(推荐)的文章就介绍到这了,更多相关jdk函数式编程内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。