jdk中有许多函数式接口,也会有许多方法会使用函数式接口作为参数,同时在各种源码中也大量使用了这些方法,那么我们在实际工作中应该如何使用!我们就来盘一盘,这样也有助于写出优雅的代码,使我们在阅读源码时事半功倍。
1 jdk中常见的lamada表达式java中可以使用lamada表达式的接口都有@functionalinterface注解。
先来看看util.function包下面含有functionalinterface注解的接口。一屏显示不全,可见功能非常齐全。
鉴于常用的一些函数式接口有function/consumer/supplier/predicate以及runnable等。本篇介绍这几类接口。
1.1 runnable@functionalinterfacepublic interface runnable { public abstract void run();}runnable 使用lamada方式书写时,无参数,无返回值。最终执行的是run方法
使用demo
new thread(() - > { system.out.println(javanorth runnable);}).start();1.2 functionfunction 表示接受一个参数并产生结果的函数。
@functionalinterfacepublic interface function { /** * applies this function to the given argument. * * @param t the function argument * @return the function result */ r apply(t t); default function compose(function before) { objects.requirenonnull(before); return (v v) - > apply(before.apply(v)); } default function andthen(function after) { objects.requirenonnull(after); return (t t) - > after.apply(apply(t)); } static function identity() { return t - > t; }}function接受一个参数t,并且有返回值 r, 其实现也主要是实现此方法 r apply(t t);
function 的一个示例:
list list = new arraylist();list collect = list.stream().map((x) - > { return java north function + x;}).collect(collectors.tolist());上述示例中是一个stream的map方法。其中x为输入参数,『java north and + x』为输出。
1.3 consumerconsumer表示接受一个参数,没有返回值的操作,主要方法为 void accept(t t);
@functionalinterfacepublic interface consumer { /** * performs this operation on the given argument. * * @param t the input argument */ void accept(t t); default consumer andthen(consumer after) { objects.requirenonnull(after); return (t t) - > { accept(t); after.accept(t); }; }}1.3.1 consumer 在java中的应用常见的有list的foreach等。
list.foreach(x - > system.out.println( java north consumer test + x));x为参数,输出语句直接执行。
下面的map的foreach参数为biconsumer,其入参有两个。
map map = new hashmap();map.foreach((k,v) - > { system.out.println(java north big consumer map key : +k + value: +v );});1.3.2 自定义带有consumer的方法public class consumerbiconsumerdemo { public static void main(string[] args) { consumer constring = (x) - > system.out.println(x.touppercase()); constring.accept(i love java north ); biconsumer bicon = (x,y) - > system.out.println (x + y); bicon.accept(i love ,java); list plist = arrays.aslist(new person(java),new person(north)); acceptallemployee(plist,p - > system.out.println(p.name)); acceptallemployee(plist,person - > {person.name = unknow;}); acceptallemployee(plist,person - > system.out.println(person.name)); } public static void acceptallemployee(list plist, consumer con){ plist.foreach(person - > {con.accept(person);}); }}class person{ public string name; public person (string name){ this.name = name; }}1.4 suppliersupplier没有参数,有一个返回值。
@functionalinterfacepublic interface supplier { /** * gets a result. * * @return a result */ t get();}supplier 示例如下:
public class supplierdemo { public static void main(string[] args) { supplierdemo sdemo = new supplierdemo(); supplier s = () - > localdatetime.now(); localdatetime localdatetime = s.get(); system.out.println(s.get()); supplier listsupplier = sdemo.listsupplier(); list list = listsupplier.get(); person person = personfactory(person::new); system.out.println(person); person javanorth = personfactory(() - > new person(javanorth)); system.out.println(javanorth); } public supplier listsupplier(){ return arraylist::new; } public static person personfactory(supplier s){ person person = s.get(); if(person.getname() == null) person.setname(default); person.setage(18); return person; } static class person { string name; int age; public person() { } public person(string name) { this.name = name; } 。。。 }}1.5 predicate主要方法为test,其主要是传入一个参数,返回一个boolean类型的值。
@functionalinterfacepublic interface predicate { /** * evaluates this predicate on the given argument. * * @param t the input argument * @return {@code true} if the input argument matches the predicate, * otherwise {@code false} */ boolean test(t t); default predicate and(predicate other) { objects.requirenonnull(other); return (t) - > test(t) && other.test(t); } default predicate negate() { return (t) - > !test(t); } default predicate or(predicate other) { objects.requirenonnull(other); return (t) - > test(t) || other.test(t); } ......}predicate简单示例:
public class predicatedemo { public static void main(string[] args) { predicate predicate = (s) - > s > 5; predicate predicate2 = (s) - > s > 8; system.out.println( 3 大于5 ? + predicate.test(3)); system.out.println( 6 大于5 ? + predicate.test(6)); system.out.println(7 大于5 and 大于8 + predicate.and(predicate2).test(7)); system.out.println(7 大于5 or 大于8 + predicate.or(predicate2).test(7)); list list = arrays.aslist(3,5,6,2,8,4,7,9); list collect = list.stream().filter(predicate).collect(collectors.tolist()); system.out.println(list); system.out.println(collect); }}上述代码运行结果
3 大于5 ? false 6 大于5 ? true7 大于5 and 大于8 false7 大于5 or 大于8 true[3, 5, 6, 2, 8, 4, 7, 9][6, 8, 7, 9]2 常用的lamada参数特征lamada 的一些表达式将方法的一些执行逻辑放到了参数中,使得方法的返回值根据传入的参数的逻辑而变化。从而实现了在一定的方法不变的情况下,使代码执行传入参数相关的逻辑。
常用的一些lamada使用如下:
runnable 无入参,无返回值 。
() - > { system.out.println(strf.apply(javanorth runnable));}function 有入参,有返回值
function strf = (s) - > { return s + javanorth function; };system.out.println(strf.apply(test ));consumer有入参,无返回值。
consumer srtc = (s) - > {system.out.println(s + javanorth test );};srtc.accept(hello world);supplier 无入参,有返回值。
supplier srtp = () - > {return i love avanorth ;};system.out.println(srtp.get());predicate 有入参,返回一个boolean类型的值
predicate predicate = (s) - > s > 5;system.out.println( 3 大于5 ? + predicate.test(3));3 自定义lamada函数式接口结合之前的常用lamada函数的介绍,下面我们自定义一个简单的函数式接口。
@functionalinterfacepublic interface myfunction { public void print(t t);}public class myfunctiondemo { public static void printstring(string str , myfunction myf){ myf.print(str); } public static void main(string[] args) { printstring(i love , (str) - > {system.out.println(str + java north);}); }}其实很简单,就是展示了一下自定义函数式接口的应用实例而已。
总结函数式接口的使用可以简化我们的代码,很大程度上提高代码的可读性。在程序执行上可能性能稍微有所降低,但对开发带来的便捷与好处是大于其性能上的微弱损失的。除了介绍的几种常见的函数式编程以外,还有许多其他的函数式接口等着我们去利用。听完这些话之后,软软猿妹也对常用的函数式接口有所了解,接下来下定决心要好好学一学函数式接口了。
I2C总线的基本工作过程
SNP BLUEFIELD™助力徐工集团SAP ERP快速升级
如何建立电梯物联网安全运行预警体系
F-PACE是捷豹旗下一款中型SUV,性能与美学完美兼顾!
行业政策密集发布 2017仪器市场或迎新变革
JDK中常见的Lamada表达式
今年我们会不会用到5G的网络呢?
彩电市场群雄逐鹿 利润增长依然面临多重考验
11万转无感FOC算法高速吹风筒方案【其利天下技术】
红米Note5什么时候上市?红米Note5最新消息:配置、价格很惊喜,史上的性价比王者?
振荡培养箱的主要特点及使用指南说明
华兴源创:面板业务持续发力,半导体检测获重大突破
让我告诉你!人脸识别到底安不安全?一支神秘多国部队破解世界难题
DPoS共识机制有哪些优势
前有iPhone8、小米MIX2,后有vivox20,全面屏战争打响!vivo x20发布会邀请函曝光:地点绝了
3x3矩阵键盘扫描原理及扫描程序
LED照明系统的评估标准和过程
恒温控制器的使用方法
中兴全球首款屏下摄像头手机
1966年研制的移动式机器人长什么样?