保健励志美文体育育儿作文
投稿投诉
作文动态
热点娱乐
育儿情感
教程科技
体育养生
教案探索
美文旅游
财经日志
励志范文
论文时尚
保健游戏
护肤业界

Java8新特性之Lambda表达式入门(一)

  为什么学Lambda
  Lambda是一个匿名函数,我们可以把Lambda表达式理解为是一段可以传递的代码(将代码像数据一样进行传递)。可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格,使Java的语言表达能力得到了提升。
  虽然上述文字写的比较高大上但其实Lambda最先是在PHP中被使用,Java看着这个挺好的就借鉴了。上面的文字看着还是比较懵懂的,直接上代码体验一把还是比较直观的。
  这篇文章只是浅浅的向大家介绍一下Lambda有什么简洁地方,让大家能够有比较直观的感觉,之后的文章我们会详细介绍。希望这些Java8的神奇之处能吸引到你。案例
  数据准备
  创建一个Employee类,属性有name,age,salary,并提供各种构造,如下packagecom。csdn。entity;authorsummerdate202204159:52publicclassEmployee{privateStringname;privateIntegerage;privateDoublesalary;publicEmployee(){}publicEmployee(Stringname,Integerage,Doublesalary){this。namename;this。ageage;this。salarysalary;}publicStringgetName(){returnname;}publicvoidsetName(Stringname){this。namename;}publicIntegergetAge(){returnage;}publicvoidsetAge(Integerage){this。ageage;}publicDoublegetSalary(){returnsalary;}publicvoidsetSalary(Doublesalary){this。salarysalary;}OverridepublicStringtoString(){returnEmployee{namename,ageage,salarysalary};}}
  测试代码编写
  创建一个测试类TestLambda并在其中准备好数据authorsummerdate202204159:54publicclassTestLambda{ListEmployeeemployeesArrays。asList(newEmployee(张三,18,6666。66),newEmployee(李四,38,3333。66),newEmployee(王五,32,4444。66),newEmployee(赵六,42,5555。66),newEmployee(田七,21,9999。66),newEmployee(王八,19,8888。66),newEmployee(张九,52,7777。66));}
  查询employees集合中年龄大于35岁的员工(传统方式)
  在测试类TestLambda中加入下面两个方法查询年龄大于35岁的员工的方法publicListEmployeegetEmployeesAge(ListEmployeelist){ListEmployeeempsnewArrayList();for(Employeeemp:list){if(emp。getAge()35){emps。add(emp);}}returnemps;}测试代码Testpublicvoidtest1(){ListEmployeelistgetEmployeesAge(employees);for(Employeeemp:list){System。out。println(emp);}}
  输出的结果为Employee{name李四,age38,salary3333。66}Employee{name赵六,age42,salary5555。66}Employee{name张九,age52,salary7777。66}
  查询employees集合中工资大于6000的员工(传统方式)
  在测试类TestLambda中加入下面两个方法查询工资大于5000的员工的方法publicListEmployeegetEmployeesSalary(ListEmployeelist){ListEmployeeempsnewArrayList();for(Employeeemp:list){if(emp。getSalary()6000){emps。add(emp);}}returnemps;}测试代码Testpublicvoidtest2(){ListEmployeelistgetEmployeesSalary(employees);for(Employeeemp:list){System。out。println(emp);}}
  输出结果为Employee{name张三,age18,salary6666。66}Employee{name田七,age21,salary9999。66}Employee{name王八,age19,salary8888。66}Employee{name张九,age52,salary7777。66}
  上述存在的问题
  我们可以看到中其实仅仅只是过滤条件不同,一个是年龄大于35一个是工资大于5000,就需要我们写两个方法来提供实现。那么有没有什么可以优化的地方呢?答案是肯定的。
  优化方式一(策略模式)
  如果我们不重新写两个方法来分别过滤年龄和工资的话,不知道你会用什么方式来进行优化,我这里先说一种我们的模式优化方法即为策略模式。
  一、我们需要创建一个接口。如下packagecom。csdn。myinterface;authorsummerdate2022041510:18publicinterfaceMyPredicateT{booleantest(Tt);}
  二、我们需要创建两个实现了结构的实现类,分别用来实现查询年龄大于35岁的员工和查询工资大于5000的员工。两个实现类如下packagecom。csdn。myinterface。impl;importcom。csdn。entity。Employee;importcom。csdn。myinterface。MyPredicate;authorsummerdate2022041510:21publicclassEmployeeAgeimplementsMyPredicateEmployee{查询年龄大于35岁的员工信息的方法paramemployeereturnOverridepublicbooleantest(Employeeemployee){returnemployee。getAge()35;}}packagecom。csdn。myinterface。impl;importcom。csdn。entity。Employee;importcom。csdn。myinterface。MyPredicate;authorsummerdate2022041510:25publicclassEmployeeSalaryimplementsMyPredicateEmployee{查询薪资大于5000的员工的方法paramemployeereturnOverridepublicbooleantest(Employeeemployee){returnemployee。getSalary()5000;}}
  三、在测试类TestLambda中加入如下两个方法并进行测试publicListEmployeefilterEmployee(ListEmployeelist,MyPredicateEmployeemp){ListEmployeeempsnewArrayList();for(Employeeemp:list){if(mp。test(emp)){emps。add(emp);}}returnemps;}Testpublicvoidtest3(){测试年龄大于35的的方法ListEmployeelist1filterEmployee(employees,newEmployeeAge());for(Employeeemployee:list1){System。out。println(employee);}System。out。println();测试工资大于5000的方法ListEmployeelist2filterEmployee(employees,newEmployeeSalary());for(Employeeemployee:list2){System。out。println(employee);}}
  输出结果为Employee{name李四,age38,salary3333。66}Employee{name赵六,age42,salary5555。66}Employee{name张九,age52,salary7777。66}Employee{name张三,age18,salary6666。66}Employee{name赵六,age42,salary5555。66}Employee{name田七,age21,salary9999。66}Employee{name王八,age19,salary8888。66}Employee{name张九,age52,salary7777。66}
  虽然我们在测试方法中现在只有一个filterEmployee,就可以实现了两个不同的需求,但是我们却需要写两个接口的实现类EmployeeAge、EmployeeSalary来实现我们的需求,显然也是有些浪费的。我们还要继续优化。
  优化方式二(匿名实现类)
  我们在TestLambda测试类中加入如下测试方法,即使用Mypredicate的匿名实现类而不用向上面一样创建两个实现类了(EmployeeAge、EmployeeSalary)Testpublicvoidtest4(){测试年龄大于35的的方法ListEmployeelist1filterEmployee(employees,newMyPredicateEmployee(){Overridepublicbooleantest(Employeeemployee){returnemployee。getAge()35;}});for(Employeeemployee:list1){System。out。println(employee);}System。out。println();测试工资大于5000的方法ListEmployeelist2filterEmployee(employees,newMyPredicateEmployee(){Overridepublicbooleantest(Employeeemployee){returnemployee。getSalary()5000;}});for(Employeeemployee:list2){System。out。println(employee);}}
  输出结果为Employee{name李四,age38,salary3333。66}Employee{name赵六,age42,salary5555。66}Employee{name张九,age52,salary7777。66}Employee{name张三,age18,salary6666。66}Employee{name赵六,age42,salary5555。66}Employee{name田七,age21,salary9999。66}Employee{name王八,age19,salary8888。66}Employee{name张九,age52,salary7777。66}
  其实上面的优化还是存在问题,首先这样的写法让我们的测试方法看起来非常的臃肿而且也破坏了我们方法的结构,我们只是想单纯的实现一个需求却需要写那么一大坨。
  优化方式三(Lambda表达式)
  在TestLambda类中加入如下方法Testpublicvoidtest5(){测试年龄大于35的的方法ListEmployeelist1filterEmployee(employees,ee。getAge()35);list1。forEach(System。out::println);System。out。println();测试工资大于5000的的方法ListEmployeelist2filterEmployee(employees,ee。getSalary()5000);list2。forEach(System。out::println);}
  输出结果为Employee{name张三,age18,salary6666。66}Employee{name王五,age32,salary4444。66}Employee{name田七,age21,salary9999。66}Employee{name王八,age19,salary8888。66}Employee{name张三,age18,salary6666。66}Employee{name赵六,age42,salary5555。66}Employee{name田七,age21,salary9999。66}Employee{name王八,age19,salary8888。66}Employee{name张九,age52,salary7777。66}
  这样看着是不是舒服多了,虽然现在看不懂但是没关系,与上面的方式对比的话我们第一感觉就是代码简化了,至于具体的细节我们后面的篇章会详细介绍。
  优化方式四(StreamAPI)
  上面使用Lambda方式的方法已经非常好了,对于大部分程序员来说能够熟悉使用Lambda已经是一种非常奢侈的要求了,哈哈哈。但是上面Lambda的方式还是存在问题呢,我们可以看到上述Lambda方式还是借助于了方法filterEmployee。那么有没有什么方式可以让我们自己来实现需求而不是先写一个方法然后再借助它实现呢?这就需要我们的StramApi了,当然了这个地方也是了解,或者看个热闹就行了,后面会详细介绍。
  在TestLambda测试类中加入如下方法Testpublicvoidtest7(){查询年龄大于35岁的员工employees。stream()。filter((e)e。getAge()35)。forEach(System。out::println);System。out。println();只获取前三个员工的名字employees。stream()。map(Employee::getName)。limit(3)。sorted()。forEach(System。out::println);}
  输出结果为Employee{name李四,age38,salary3333。66}Employee{name赵六,age42,salary5555。66}Employee{name张九,age52,salary7777。66}张三李四王五
  看了这些不知道你有没有觉得很神奇呢,Java8的新特性真的是非常的强大,后面的文章我们会详尽的介绍Java8的所有新特性,希望能对你的工作有所帮助,谢谢。
  完整的TestLambda测试类packagecom。csdn。test;importcom。csdn。entity。Employee;importcom。csdn。myinterface。MyPredicate;importcom。csdn。myinterface。impl。EmployeeAge;importcom。csdn。myinterface。impl。EmployeeSalary;importorg。junit。Test;importjava。util。ArrayList;importjava。util。Arrays;importjava。util。List;authorsummerdate202204159:54publicclassTestLambda{ListEmployeeemployeesArrays。asList(newEmployee(张三,18,6666。66),newEmployee(李四,38,3333。66),newEmployee(王五,32,4444。66),newEmployee(赵六,42,5555。66),newEmployee(田七,21,9999。66),newEmployee(王八,19,8888。66),newEmployee(张九,52,7777。66));查询年龄大于35岁的员工publicListEmployeegetEmployeesAge(ListEmployeelist){ListEmployeeempsnewArrayList();for(Employeeemp:list){if(emp。getAge()35){emps。add(emp);}}returnemps;}测试代码Testpublicvoidtest1(){ListEmployeelistgetEmployeesAge(employees);for(Employeeemp:list){System。out。println(emp);}}查询工资大于5000的员工的方法publicListEmployeegetEmployeesSalary(ListEmployeelist){ListEmployeeempsnewArrayList();for(Employeeemp:list){if(emp。getSalary()6000){emps。add(emp);}}returnemps;}测试代码Testpublicvoidtest2(){ListEmployeelistgetEmployeesSalary(employees);for(Employeeemp:list){System。out。println(emp);}}publicListEmployeefilterEmployee(ListEmployeelist,MyPredicateEmployeemp){ListEmployeeempsnewArrayList();for(Employeeemp:list){if(mp。test(emp)){emps。add(emp);}}returnemps;}Testpublicvoidtest3(){测试年龄大于35的的方法ListEmployeelist1filterEmployee(employees,newEmployeeAge());for(Employeeemployee:list1){System。out。println(employee);}System。out。println();测试工资大于5000的方法ListEmployeelist2filterEmployee(employees,newEmployeeSalary());for(Employeeemployee:list2){System。out。println(employee);}}Testpublicvoidtest4(){测试年龄大于35的的方法ListEmployeelist1filterEmployee(employees,newMyPredicateEmployee(){Overridepublicbooleantest(Employeeemployee){returnemployee。getAge()35;}});for(Employeeemployee:list1){System。out。println(employee);}System。out。println();测试工资大于5000的方法ListEmployeelist2filterEmployee(employees,newMyPredicateEmployee(){Overridepublicbooleantest(Employeeemployee){returnemployee。getSalary()5000;}});for(Employeeemployee:list2){System。out。println(employee);}}Testpublicvoidtest5(){测试年龄大于35的的方法ListEmployeelist1filterEmployee(employees,ee。getAge()35);list1。forEach(System。out::println);System。out。println();测试工资大于5000的的方法ListEmployeelist2filterEmployee(employees,ee。getSalary()5000);list2。forEach(System。out::println);}优化方式四:StreamAPITestpublicvoidtest7(){查询年龄大于35岁的员工employees。stream()。filter((e)e。getAge()35)。forEach(System。out::println);System。out。println();只获取前三个员工的名字employees。stream()。map(Employee::getName)。limit(3)。sorted()。forEach(System。out::println);}}

SpringBoot一个注解搞定重试机制,不能太优雅了前言在实际工作中,重处理是一个非常常见的场景,比如:发送消息失败。调用远程服务失败。争抢锁失败。这些错误可能是因为网络波动造成的,等待过后重处理就能成功。通常来说,……夏夜之音学生作文300字大自然赐予我们美妙的声音,有春天叮咚,叮咚的春来风雨声的,有秋天沙沙沙树叶落下的声音,有冬天呼呼呼的刮风声音。但我喜爱的却是夏夜的奇妙之间,有很多交错在一起的音响,犹如一曲曲歌……我所向往的生活中学生作文从小就生活在农村,对于农村里的一切是喜欢的不得了,又一次老师问我们大家向往的生活是什么,有的同学说,向往的生活就是找份好工作,有的同学说自己向往的生活就是生活在城市,还有的同学……父母的爱与我同行作文亲爱的爸爸妈妈:你们好!在此我先对你们说声谢谢,感谢你们的养育之恩。我还要说一声:你们辛苦了,你们为了我奔波劳累,从无怨言。爸爸妈妈你们视我为明珠,虽然有了一……江南秋雨作文600字最有韵味的雨,当属江南水乡的秋雨。这是一幅动人心弦的水墨画mdash;mdash;流动的水墨画。如同一幅徐徐展开的画卷,在萧瑟的秋风中,思绪如落叶般随风舞动。我似乎闻到了……关于生命的议论文700字对于每个人来说,生命,只有一次,对于生命你的态度是怎样的呢,下面为大家的分享,一起来学习一下吧关于生命的议论文700世界给予的生命太过悲哀这个世界,我是一个被弃的孩……宽容的同学我的同学方玮长着一头乌黑的秀发,两条淡淡的眉毛,一双眼睛炯炯有神。她文静可爱,从幼儿园开始就是我的同班同学,成为了我亲密的玩伴。我们之间有许多有趣的故事,就让我讲一件给你听吧。……风铃闪动的愿望作文600字窃听,风铃叮当,我听见了,不能说的愿望。mdash;mdash;题记微风徐徐吹来,窗口那串风铃ldquo;叮当rdquo;作响,院子里的蔷薇散发着阵阵清香,轻轻靠近……我国3D打印技术研发取得重要突破原标题:我国3D打印技术研发取得重要突破4月16日,国内首台增材制造轴流式水轮机真机转轮在哈电集团哈尔滨能创数字科技有限公司制造完成并成功交付,标志着哈电集团在基于机器人……上证科创板新一代信息技术ETF获批机构长期投资价值显著每经记者:黄小聪每经编辑:叶,峰今年2月,4家基金公司集体上报了4只上证科创板新一代信息技术ETF。《每日经济新闻》记者获悉,4月15日,嘉实基金、华安基金等公司已……读乡愁有感600字篇一:而现在,乡愁仍是一弯浅浅的海峡,我在这头,大陆在那头。mdash;mdash;海外游子mdash;mdash;台湾的心声太平洋,波涛汹涌,留下我,孤苦伶……2016年向经典致敬与梦想同行征文比赛范文导语:古今中外,各个知识领域中那些典范性、权威性的著作,就是经典。小编为您推荐一些关于经典的作文,供同学们参考!【向经典致敬与梦想同行征文1】昨天下午,我们学校举行……
小学关于我的读书故事为话题的记事作文500字篇一:读书故事ldquo;学,就像一只钻头,去开掘知识的深井。问,就像一把钥匙,去启开疑团的大。读书就是学问的源泉。rdquo;此话说得好,当你沉浸在书中时,你就会无法自……东数西算需关注超大规模数据要素市场构建数据作为数字时代最重要的生产要素,正在全面重构全球生产、流通、分配和消费等领域,成为大国间竞相争夺的制高点。实施东数西算工程,将有助于改善我国数据中心供需失衡的情况,促进算力的……细细品出什么味作文【篇一:细细品出桂花味作文】盛凯每个人都喜欢一种独特的香味,我对桂花的香味不能忘怀hellip;hellip;在我的乡下小院里,两边各有一颗桂花树,每到秋天,……描写心情日记3篇描写心情日记篇1光阴似箭,岁月如梭,我觉得时间总过得太快了。今天(7月16日)已是我们阳曦社会实践队来到三下乡基地龙樟小学后的第六天了,在这里,我收获的不止是生活经验,还……中考英语作文Environment导语:随着环境污染问题日益加剧,我们每个人都要履行保护环境的责任和义务。下面是yuwenmi小编为大家整理的相关英语作文,欢迎阅读与借鉴,谢谢!Harmonywithth……铅笔橡皮转笔刀小学四年级作文铅笔橡皮转笔刀小学四年级作文1一天,明月考试得了第一名,一放学,就高高兴兴的拿着试卷回家了。回到家,明月刚放下书包,就听见铅笔橡皮转笔刀在吵架。明月平时写字、……二叔1200字作文两个女学生向校门外走去。一个穿着校服,一个时髦打扮。阳光特别好,阳光下的两张脸特别可爱。这时,一辆宝马向学校驶来。打扮时髦的女学生很快走过去,而穿着校服的女学生没有迈开脚……开学的计划作文600字开学的时候,做好下个学期要执行的计划,不要让自己在未来感到迷茫。下面是小编为您推荐的作文:【作文一】等了好久了,学校终于打开了那宽大的大门。我也可以跟那些熟悉的同学……开学以来的一件事日记导语:新学期快要开始呢,各位准备好了么?以下是小编整理的开学以来的一件事日记?欢迎阅读参考。【篇一:开学以来的一件事日记】2010年9月1日星期3地点:学校天气:晴转阴……2020年小学三年级抗击疫情日记近期,新型冠状病毒肺炎在全国各地蔓延,成为了关注的事件。新型冠状病毒来自于武汉一家海鲜市场,后来从武汉蔓延到各个地区。下面是小编收集的2020年小学三年级抗击疫情日记,欢迎阅读……榜样作文700字4篇1榜样作文在我的身旁有许许多多的榜样,勤劳的工人伯伯,辛勤的教师很多很多,在我的心目中最令我敬的还是我们无私奉献的清洁工了。有人叫他们是城市的美容师,我也是。为什么呢?当……英中马斯克警告说中国经济可能超过美国,称美国必须停止打脸ElonMuskwarnsChinaseconomycouldovertakeUS,saysAmericansmuststoppunchingourselvesinthefac……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网