ImageVerifierCode 换一换
格式:PDF , 页数:114 ,大小:1.38MB ,
资源ID:1241135      下载积分:25 金币
快捷注册下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

开通VIP
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.zixin.com.cn/docdown/1241135.html】到电脑端继续下载(重复下载【60天内】不扣币)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

开通VIP折扣优惠下载文档

            查看会员权益                  [ 下载后找不到文档?]

填表反馈(24小时):  下载求助     关注领币    退款申请

开具发票请登录PC端进行申请

   平台协调中心        【在线客服】        免费申请共赢上传

权利声明

1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:0574-28810668;投诉电话:18658249818。

注意事项

本文(Java8从入门到精通.pdf)为本站上传会员【Stan****Shan】主动上传,咨信网仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知咨信网(发送邮件至1219186828@qq.com、拔打电话4009-655-100或【 微信客服】、【 QQ客服】),核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载【60天内】不扣币。 服务填表

Java8从入门到精通.pdf

1、目录作者简介2第一章 Java8 总览81.1 Java8 有哪些新特性?81.2 Java8 有哪些优点?9第二章 Lambda 表达式102.1 什么是 Lambda 表达式?102.2 匿名内部类102.3 Lambda 表达式112.4 对比常规方法和 Lambda 表达式122.5 匿名类到 Lambda 表达式222.6 Lambda 表达式的语法232.7 函数式接口262.8 Lambda 表达式典型案例282.8.1 案例一282.8.2 案例二312.8.3 案例三33第三章 函数式接口总览353.1 四大核心函数式接口总览353.2 其他函数接口总览353.3 四大核心函

2、数式接口373.3.1 Consumer 接口373.3.2 Supplier 接口383.3.3 Function 接口383.3.4 Predicate 接口40第四章 Java7 与 Java8 中的 HashMap424.1 JDK8 HashMap 重排序424.2 筛选与切片424.3 中间操作424.4 终止操作434.5 规约操作434.6 Optional 容器类44第五章 方法引用与构造器引用455.1 方法引用455.2 构造器引用465.3 数组引用47第六章 Java8 中的 Stream486.1 什么是 Stream?486.2 Stream 操作的三个步骤486

3、3 如何创建 Stream?496.4 Stream 的中间操作506.5 Stream 的终止操作526.6 并行流与串行流566.7 Fork/Join 框架566.8 Stream 概述596.9 如何创建 Stream 流?606.10 Stream 的中间操作656.11 筛选与切片656.12 映射706.13 排序736.14 Stream 的终止操作746.15 查找与匹配746.16 规约796.17 收集816.18 如何收集 Stream 流?826.19 并行流实例85第七章 Optional 类867.1 什么是 Optional 类?867.2 Optional

4、类示例86第八章 默认方法968.1 接口中的默认方法968.2 默认方法的原则968.3 接口中的静态方法99第九章 本地时间和时间戳1009.1 使用 LocalDate、LocalTime、LocalDateTime1009.2 Instant 时间戳1039.3 Duration 和 Period1039.4 日期的操作1049.5 解析与格式化1069.6 时区的处理1069.7 与传统日期处理的转换110第十章 Java8 对注解的增强111第一章 Java8 总览第一章 Java8 总览1.2 Java8 有哪些优点?简单来说 Java8 优点如下所示。速度更快代码更少(增加了新

5、的语法 Lambda 表达式)强大的 Stream API便于并行最大化减少空指针异常 Optional第二章 Lambda 表达式10第二章 Lambda 表达式2.1 什么是 Lambda 表达式?Lambda 表达式是一个匿名函数,我们可以这样理解 Lambda 表达式:Lambda 是一段可以传递的代码(能够做到将代码像数据一样进行传递)。使用 Lambda 表达式能够写出更加简洁、灵活的代码。并且,使用 Lambda 表达式能够使 Java 的语言表达能力得到提升。2.2 匿名内部类在介绍如何使用 Lambda 表达式之前,我们先来看看匿名内部类,例如,我们使用匿名内部类比较两个 I

6、nteger 类型数据的大小Comparator com=newnew Comparator()Overridepublicpublic int compare(Integer o1,Integer o2)returnreturn Ipare(o1,o2);在上述代码中,我们使用匿名内部类实现了比较两个 Integer 类型数据的大小。接下来,我们就可以将上述匿名内部类的实例作为参数,传递到其他方法中了,如下所示。TreeSet treeSet=newnew TreeSet(com);完整的代码如下所示。11第二章 Lambda 表达式Testpublicpublic void test1()

7、Comparator com=newnew Comparator()Overridepublicpublic int compare(Integer o1,Integer o2)returnreturn Ipare(o1,o2);TreeSet treeSet=newnew TreeSet(com);我们分析下上述代码,在整个匿名内部类中,实际上真正有用的就是下面一行代码。returnreturn Ipare(o1,o2);其他的代码本质上都是“冗余”的。但是为了书写上面的一行代码,我们不得不在匿名内部类中书写更多的代码。2.3 Lambda 表达式如果使用 Lambda 表达式完成两个 In

8、teger 类型数据的比较,我们该如何实现呢?Comparator com=(x,y)-Ipare(x,y);看到没,使用 Lambda 表达式,我们只需要使用一行代码就能够实现两个 Integer 类型数据的比较。我们也可以将 Lambda 表达式传递到 TreeSet 的构造方法中,如下所示。TreeSet treeSet=newnew TreeSet(x,y)-Ipare(x,y);直观的感受就是使用 Lambda 表达式一行代码就能搞定匿名内部类多行代码的功能。第二章 Lambda 表达式12看到这,不少读者会问:我使用匿名内部类的方式实现比较两个整数类型的数据大小并不复杂啊!我为啥还

9、要学习一种新的语法呢?其实,我想说的是:上面咱们只是简单的列举了一个示例,接下来,咱们写一个稍微复杂一点的例子,来对比下使用匿名内部类与 Lambda 表达式哪种方式更加简洁。2.4 对比常规方法和 Lambda 表达式例如,现在有这样一个需求:获取当前公司中员工年龄大于 30 岁的员工信息。首先,我们需要创建一个 Employee 实体类来存储员工的信息。DataBuilderToStringNoArgsConstructorAllArgsConstructorpublicpublic classclass Employee implementsimplements Serializable

10、 privateprivate static final long serialVersionUID=-9079722457749166858L;privateprivate String name;privateprivate Integer age;privateprivate Double salary;在 Employee 中,我们简单存储了员工的姓名、年龄和薪资。接下来,我们创建一个存储多个员工的 List 集合,如下所示。protected List employees=Arrays.asList(new Employee(张三,18,9999.99),new Employee(李

11、四,38,5555.55),new Employee(王五,60,6666.66),13第二章 Lambda 表达式new Employee(赵六,16,7777.77),new Employee(田七,18,3333.33););1.常规遍历集合我们先使用常规遍历集合的方式来查找年龄大于等于 30 的员工信息。publicpublic List filterEmployeesByAge(List list)List employees=newnew ArrayList();forfor(Employee e:list)if if(e.getAge()=30)employees.add(e);

12、returnreturn employees;接下来,我们测试一下上面的方法。Testpublicpublic void test3()List employeeList=filterEmployeesByAge(thisthis.employees);forfor(Employee e:employeeList)System.out.println(e);运行 test3 方法,输出信息如下所示。Employee(name=李四,age=38,salary=5555.55)Employee(name=王五,age=60,salary=6666.66)第二章 Lambda 表达式14总体来说,

13、查找年龄大于或者等于 30 的员工信息,使用常规遍历集合的方式稍显复杂了。例如,需求发生了变化:获取当前公司中员工工资大于或者等于 5000 的员工信息。此时,我们不得不再次创建一个按照工资过滤的方法。publicpublic List filterEmployeesBySalary(List list)List employees=newnew ArrayList();forfor(Employee e:list)if if(e.getSalary()=5000)employees.add(e);returnreturn employees;对比 filterEmployeesByAge()

14、方法和 filterEmployeesBySalary 方法后,我们发现,大部分的方法体是相同的,只是 for 循环中对于条件的判断不同。如果此时我们再来一个需求,查找当前公司中年龄小于或者等于 20 的员工信息,那我们又要创建一个过滤方法了。看来使用常规方法是真的不方便啊!这里,问大家一个问题:对于这种常规方法最好的优化方式是啥?相信有不少小伙伴会说:将公用的方法抽取出来。没错,将公用的方法抽取出来是一种优化方式,但它不是最好的方式。最好的方式是啥?那就是使用 设计模式 啊!设计模式可是无数前辈不断实践而总结出的设计原则和设计模式。大家可以查看设计模式汇总你需要掌握的 23 种设计模式都在这

15、儿了!一文来学习设计模式专题。2.使用设计模式优化代码如何使用设计模式来优化上面的方法呢,大家继续往下看,对于设计模式不熟悉的同学可以先15第二章 Lambda 表达式根据设计模式汇总你需要掌握的 23 种设计模式都在这儿了!来学习。我们先定义一个泛型接口 MyPredicate,对传递过来的数据进行过滤,符合规则返回 true,不符合规则返回 false。publicpublic interfaceinterface MyPredicate/*对传递过来的T类型的数据进行过滤*符合规则返回true,不符合规则返回false*/boolean filter(T t);接下来,我们创建 MyPr

16、edicate 接口的实现类 FilterEmployeeByAge 来过滤年龄大于或者等于30 的员工信息。publicpublic classclass FilterEmployeeByAge implementsimplements MyPredicate Overridepublicpublic boolean filter(Employee employee)returnreturn employee.getAge()=30;我们定义一个过滤员工信息的方法,此时传递的参数不仅有员工的信息集合,同时还有一个我们定义的接口实例,在遍历员工集合时将符合过滤条件的员工信息返回。/优化方式一p

17、ublicpublic List filterEmployee(List list,MyPredicate myPredicate)List employees=newnew ArrayList();forfor(Employee e:list)if if(myPredicate.filter(e)employees.add(e);第二章 Lambda 表达式16returnreturn employees;接下来,我们写一个测试方法来测试优化后的代码。Testpublicpublic void test4()List employeeList=thisthis.filterEmployee(

18、thisthis.employees,newnew FilterEmployeeByAge();forfor(Employee e:employeeList)System.out.println(e);运行 test4()方法,输出的结果信息如下所示。Employee(name=李四,age=38,salary=5555.55)Employee(name=王五,age=60,salary=6666.66)写到这里,大家是否有一种豁然开朗的感觉呢?没错,这就是设计模式的魅力,对于设计模式不熟悉的小伙伴,一定要参照设计模式汇总你需要掌握的 23 种设计模式都在这儿了!来学习。我们继续获取当前公司中

19、工资大于或者等于 5000 的员工信息,此时,我们只需要创建一个FilterEmployeeBySalary 类实现 MyPredicate 接口,如下所示。publicpublic classclass FilterEmployeeBySalary implementsimplements MyPredicateOverridepublicpublic boolean filter(Employee employee)returnreturn employee.getSalary()=5000;17第二章 Lambda 表达式接下来,就可以直接写测试方法了,在测试方法中继续调用 filter

20、Employee(List list,MyPredicate myPredicate)方法。Testpublicpublic void test5()List employeeList=thisthis.filterEmployee(thisthis.employees,newnew FilterEmployeeBySalary();forfor(Employee e:employeeList)System.out.println(e);运行 test5 方法,输出的结果信息如下所示。Employee(name=张三,age=18,salary=9999.99)Employee(name=李四

21、age=38,salary=5555.55)Employee(name=王五,age=60,salary=6666.66)Employee(name=赵六,age=16,salary=7777.77)可以看到,使用设计模式对代码进行优化后,无论过滤员工信息的需求如何变化,我们只需要创建 MyPredicate 接口的实现类来实现具体的过滤逻辑,然后在测试方法中调用 filterEmployee(List list,MyPredicate myPredicate)方法将员工集合和过滤规则传入即可。这里,问大家一个问题:上面优化代码使用的设计模式是哪种设计模式呢?如果是你,你会想到使用设计模式来

22、优化自己的代码吗?小伙伴们自己先思考一下到底使用的设计模式是什么?文末我会给出答案!使用设计模式优化代码也有不好的地方:每次定义一个过滤策略的时候,我们都要单独创建一个过滤类!第二章 Lambda 表达式183.匿名内部类那使用匿名内部类是不是能够优化我们书写的代码呢,接下来,我们就使用匿名内部类来实现对员工信息的过滤。先来看过滤年龄大于或者等于 30 的员工信息。Testpublicpublic void test6()List employeeList=thisthis.filterEmployee(thisthis.employees,newnew MyPredicate()Overri

23、depublicpublic boolean filter(Employee employee)returnreturn employee.getAge()=30;);forfor(Employee e:employeeList)System.out.println(e);运行 test6 方法,输出如下结果信息。Employee(name=李四,age=38,salary=5555.55)Employee(name=王五,age=60,salary=6666.66)再实现过滤工资大于或者等于 5000 的员工信息,如下所示。Testpublicpublic void test7()List

24、employeeList=thisthis.filterEmployee(thisthis.employees,newnew MyPredicate()Overridepublicpublic boolean filter(Employee employee)returnreturn employee.getSalary()=5000;19第二章 Lambda 表达式);forfor(Employee e:employeeList)System.out.println(e);运行 test7 方法,输出如下结果信息。Employee(name=张三,age=18,salary=9999.99)

25、Employee(name=李四,age=38,salary=5555.55)Employee(name=王五,age=60,salary=6666.66)Employee(name=赵六,age=16,salary=7777.77)匿名内部类看起来比常规遍历集合的方法要简单些,并且将使用设计模式优化代码时,每次创建一个类来实现过滤规则写到了匿名内部类中,使得代码进一步简化了。但是,使用匿名内部类代码的可读性不高,并且冗余代码也比较多!那还有没有更加简化的方式呢?4.重头戏:Lambda 表达式在使用 Lambda 表达式时,我们还是要调用之前写的 filterEmployee(List li

26、st,MyPredicate myPredicate)方法。注意看,获取年龄大于或者等于 30 的员工信息。Testpublicpublic void test8()filterEmployee(thisthis.employees,(e)-e.getAge()=30).forEach(System.out:println);第二章 Lambda 表达式 e.getSalary()=5000).forEach(System.out:println);没错,使用 Lambda 表达式,又是一行代码就搞定了!运行 test9 方法,输出如下的结果信息。Employee(name=张三,age=18

27、salary=9999.99)Employee(name=李四,age=38,salary=5555.55)Employee(name=王五,age=60,salary=6666.66)Employee(name=赵六,age=16,salary=7777.77)另外,使用 Lambda 表达式时,只需要给出需要过滤的集合,我们就能够实现从集合中过滤指定规则的元素,并输出结果信息。5.重头戏:Stream API使用 Lambda 表达式结合 Stream API,只要给出相应的集合,我们就可以完成对集合的各种过滤并输出结果信息。21第二章 Lambda 表达式例如,此时只要有一个 empl

28、oyees 集合,我们使用 Lambda 表达式来获取工资大于或者等于 5000 的员工信息。Testpublicpublic void test10()employees.stream().filter(e)-e.getSalary()=5000).forEach(System.out:println);没错,只给出一个集合,使用 Lambda 表达式和 Stream API,一行代码就能够过滤出想要的元素并进行输出。运行 test10 方法,输出如下的结果信息。Employee(name=张三,age=18,salary=9999.99)Employee(name=李四,age=38,sa

29、lary=5555.55)Employee(name=王五,age=60,salary=6666.66)Employee(name=赵六,age=16,salary=7777.77)如果我们只想要获取前两个员工的信息呢?其实也很简单,如下所示。Testpublicpublic void test11()employees.stream().filter(e)-e.getSalary()=5000).limit(2).forEach(System.out:println);可以看到,我们在代码中添加了 limit(2)来限制只获取两个员工信息。运行 test11 方法,输出如下的结果信息。Emp

30、loyee(name=张三,age=18,salary=9999.99)Employee(name=李四,age=38,salary=5555.55)使用 Lambda 表达式和 Stream API 也可以获取指定的字段信息,例如获取工资大于或者等于 5000 的员工姓名。第二章 Lambda 表达式 e.getSalary()=5000).map(Employee:getName).forEach(System.out:println);可以看到,使用 map 过滤出了工资大于或者等于 5000 的员工姓名。运行 test12 方法,输出如下的结果信息。张三李四王五赵六是不是很简单呢?最后

31、给出文中使用的设计模式:策略模式。2.5 匿名类到 Lambda 表达式我们先来看看从匿名类如何转换到 Lambda 表达式呢?这里,我们可以使用两个示例来说明如何从匿名内部类转换为 Lambda 表达式。匿名内部类到 Lambda 表达式使用匿名内部类如下所示。Runnable r=newnew Runnable()Overridepublicpublic void run()System.out.println(Hello Lambda);23第二章 Lambda 表达式转化为 Lambda 表达式如下所示。Runnable r=()-System.out.println(Hello L

32、ambda);匿名内部类作为参数传递到 Lambda 表达式作为参数传递使用匿名内部类作为参数如下所示。TreeSet ts=newnew TreeSet(newnew Comparator()Overridepublicpublic int compare(Integer o1,Integer o2)returnreturn Ipare(o1,o2););使用 Lambda 表达式作为参数如下所示。TreeSet ts=newnew TreeSet(o1,o2)-Ipare(o1,o2););从直观上看,Lambda 表达式要比常规的语法简洁的多。2.6 Lambda 表达式的语法Lambd

33、a 表达式在 Java 语言中引入了“-”操作符,“-”操作符被称为 Lambda 表达式的操作符或者箭头操作符,它将 Lambda 表达式分为两部分:左侧部分指定了 Lambda 表达式需要的所有参数。第二章 Lambda 表达式 System.out.println(Hello Lambda);具体示例如下所示。Testpublicpublic void test1()Runnable r=()-System.out.println(Hello Lambda);newnew Thread(r).start();2.语法格式二:Lambda 表达式需要一个参数,并且无返回值Consumer

34、func=(s)-System.out.println(s);具体示例如下所示。Testpublicpublic void test2()Consumer consumer=(x)-System.out.println(x);consumer.accept(Hello Lambda);25第二章 Lambda 表达式3.语法格式三:Lambda 只需要一个参数时,参数的小括号可以省略Consumer func=s-System.out.println(s);具体示例如下所示。Testpublicpublic void test3()Consumer consumer=x-System.out.

35、println(x);consumer.accept(Hello Lambda);4.语法格式四:Lambda 需要两个参数,并且有返回值BinaryOperator bo=(a,b)-System.out.println(函数式接口);returnreturn a+b;具体示例如下所示。Testpublicpublic void test4()Comparator comparator=(x,y)-System.out.println(函数式接口);returnreturn Ipare(x,y);5.语法格式五:当 Lambda 体只有一条语句时,return 和大括号可以省略BinaryO

36、perator bo=(a,b)-a+b;第二章 Lambda 表达式26具体示例如下所示。Testpublicpublic void test5()Comparator comparator=(x,y)-Ipare(x,y);6.语法格式六:Lambda 表达式的参数列表的数据类型可以省略不写,因为 JVM编译器能够通过上下文推断出数据类型,这就是“类型推断”BinaryOperator bo=(Integer a,Integer b)-returnreturn a+b;等同于:BinaryOperator bo=(a,b)-returnreturn a+b;上述 Lambda 表达式中的参

37、数类型都是由编译器推断得出的。Lambda 表达式中无需指定类型,程序依然可以编译,这是因为 javac 根据程序的上下文,在后台推断出了参数的类型。Lambda 表达式的类型依赖于上下文环境,是由编译器推断出来的。这就是所谓的“类型推断”。2.7 函数式接口Lambda 表达式需要函数式接口的支持,所以,我们有必要来说说什么是函数式接口。只包含一个抽象方法的接口,称为函数式接口。27第二章 Lambda 表达式可以通过 Lambda 表达式来创建该接口的对象。(若 Lambda 表达式抛出一个受检异常,那么该异常需要在目标接口的抽象方法上进行声明)。可以在任意函数式接口上使用 Functio

38、nalInterface 注解,这样做可以检查它是否是一个函数式接口,同时 javadoc 也会包含一条声明,说明这个接口是一个函数式接口。我们可以自定义函数式接口,并使用 Lambda 表达式来实现相应的功能。例如,使用函数式接口和 Lambda 表达式实现对字符串的处理功能。首先,我们定义一个函数式接口 MyFunc,如下所示。FunctionalInterfacepublicpublic interfaceinterface MyFunc publicpublic T getValue(T t);接下来,我们定义一个操作字符串的方法,其中参数为 MyFunc 接口实例和需要转换的字符串。

39、publicpublic String handlerString(MyFunc myFunc,String str)returnreturn myFunc.getValue(str);接下来,我们对自定义的函数式接口进行测试,此时我们传递的函数式接口的参数为 Lambda表达式,并且将字符串转化为大写。Testpublicpublic void test6()String str=handlerString(s)-s.toUpperCase(),binghe);System.out.println(str);第二章 Lambda 表达式 s.substring(0,4),binghe);Sy

40、stem.out.println(str);运行 test7 方法,得出的结果信息如下所示。bing可以看到,我们可以通过 handlerString(MyFunc myFunc,String str)方法结合Lambda 表达式对字符串进行任意操作。注意:作为参数传递 Lambda 表达式:为了将 Lambda 表达式作为参数传递,接收 Lambda 表达式的参数类型必须是与该 Lambda 表达式兼容的函数式接口的类型。2.8 Lambda 表达式典型案例2.8.1 案例一需求调用 Collections.sort()方法,通过定制排序比较两个 Employee(先比较年龄,年龄相同按姓名

41、比较),使用 Lambda 表达式作为参数传递。29第二章 Lambda 表达式实现这里,我们先创建一个 Employee 类,为了满足需求,我们在 Employee 类中定义了姓名、年龄和工资三个字段,如下所示。DataBuilderToStringNoArgsConstructorAllArgsConstructorpublicpublic classclass Employee implementsimplements Serializable privateprivate static final long serialVersionUID=-9079722457749166858L;

42、privateprivate String name;privateprivate Integer age;privateprivate Double salary;接下来,我们在 TestLambda 类中定义一个成员变量 employees,employees 变量是一个 List集合,存储了 Employee 的一个列表,如下所示。protectedprotected List employees=Arrays.asList(newnew Employee(张三,18,9999.99),newnew Employee(李四,38,5555.55),newnew Employee(王五,6

43、0,6666.66),newnew Employee(赵六,8,7777.77),newnew Employee(田七,58,3333.33);前期的准备工作完成了,接下来,我们就可以实现具体的业务逻辑了。第二章 Lambda 表达式 if if(e1.getAge()=e2.getAge()returnreturn e1.getName().compareTo(e2.getName();returnreturn Ipare(e1.getAge(),e2.getAge(););employees.stream().forEach(System.out:println);上述代码比较简单,我就不

44、赘述具体逻辑了。运行 test1 方法,得出的结果信息如下所示。Employee(name=赵六,age=8,salary=7777.77)Employee(name=张三,age=18,salary=9999.99)Employee(name=李四,age=38,salary=5555.55)Employee(name=田七,age=58,salary=3333.33)Employee(name=王五,age=60,salary=6666.66)如果想倒叙输出如何处理呢,只需要在将 return Ipare(e1.getAge(),e2.getAge();修改成-return Ipare(e

45、1.getAge(),e2.getAge();即可,如下所示。Testpublicpublic void test1()Collections.sort(employees,(e1,e2)-if if(e1.getAge()=e2.getAge()returnreturn e1.getName().compareTo(e2.getName();returnreturn-Ipare(e1.getAge(),e2.getAge(););employees.stream().forEach(System.out:println);再次运行 test1 方法,得出的结果信息如下所示。31第二章 Lam

46、bda 表达式Employee(name=王五,age=60,salary=6666.66)Employee(name=田七,age=58,salary=3333.33)Employee(name=李四,age=38,salary=5555.55)Employee(name=张三,age=18,salary=9999.99)Employee(name=赵六,age=8,salary=7777.77)结果符合我们的需求。2.8.2 案例二需求1.声明函数式接口,接口中声明抽象方法 public String getValue(String str);2.声明类 TestLambda,类中编写方法

47、使用接口作为参数,将一个字符串转换为大写,并作为方法的返回值。3.再将一个字符串的第 2 个和第 4 个索引位置进行截取子串。实现首先,创建一个函数式接口 MyFunction,在 MyFunction 接口上加上注解FunctionalInterface 标识接口是一个函数式接口。如下所示。FunctionalInterfacepublicpublic interfaceinterface MyFunction publicpublic String getValue(String str);在 TestLambda 类中声明 stringHandler 方法,参数分别为待处理的字符串和函数

48、式接口的实例,方法中的逻辑就是调用函数式接口的方法来处理字符串,如下所示。第二章 Lambda 表达式 s.toUpperCase();System.out.println(value);运行 test2 方法,得出如下的结果信息。BINGHE我们再来实现字符串截取的操作,如下所示。Testpublicpublic void test3()String value=stringHandler(binghe,(s)-s.substring(1,3);System.out.println(value);注意:需求中是按照第 2 个和第 4 个索引位置进行截取子串,字符串的下标是从 0 开始的,所以

49、这里截取字符串时使用的是 substring(1,3),而不是 substring(2,4),这也是很多小伙伴容易犯的错误。另外,使用上述 Lambda 表达式形式,可以实现字符串的任意处理,并返回处理后的新字符串。运行 test3 方法,结果如下所示。33第二章 Lambda 表达式inin2.8.3 案例三需求1.声明一个带两个泛型的函数式接口,泛型类型为,其中,T 作为参数的类型,R 作为返回值的类型。2.接口中声明对象的抽象方法。3.在 TestLambda 类中声明方法。使用接口作为参数计算两个 long 型参数的和。4.再就按两个 long 型参数的乘积。实现首先,我们按照需求定义

50、函数式接口 MyFunc,如下所示。FunctionalInterfacepublicpublic interfaceinterface MyFunc R getValue(T t1,T t2);接下来,我们在 TestLambda 类中创建一个处理两个 long 型数据的方法,如下所示。publicpublic void operate(Long num1,Long num2,MyFunc myFunc)System.out.println(myFunc.getValue(num1,num2);我们可以使用下面的方法来完成两个 long 型参数的和。第二章 Lambda 表达式 x+y);运

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服