Java8新特性-Lambda表达式

java8 新特性

Lambda表达式

Lambda是一个匿名函数, 可以把lambda表达式理解为是一段可以传递的代码,(将代码像数据一样传递)

 // 比较两个整数的大小------采用匿名内部类的方式@Testpublic void test1(){Comparator<Integer> comp = new Comparator<Integer>() {@Overridepublic int compare(Integer o1, Integer o2) {return o1.compareTo(o2);}};System.out.println(comp.compare(9, 5));}​// 比较两个整数的大小------采用 lambdaComparator<Integer> comp2 = (a, b) -> a.compareTo(b);System.out.println(comp2.compare(10, 4));
 ​

变化 需求: 求 薪资高于5000的员工信息

 // 建立 员工类 Emp, 包含姓名 薪资,年龄import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;import lombok.ToString;​@NoArgsConstructor@AllArgsConstructor@Data@ToStringpublic class Emp {private String name;private double salary;private int age;}​//编写 测试类// 查询 薪资高于5000的员工信息private List<Emp> filterEmp(List<Emp> emps){List<Emp> list2 = new ArrayList<>();for (Emp emp: emps) {if(emp.getSalary()>5000){list2.add(emp);}}return list2;}​//查询 年龄大于30的员工信息private List<Emp> filterEmp(List<Emp> emps){List<Emp> list2 = new ArrayList<>();for (Emp emp: emps) {if(emp.getAge()>30){list2.add(emp);}}return list2;}
 // 查询 年龄小于20 或 查询 薪资低于7000的, 发现 每变更一次需求, 总是要 编写一个新的方法, 而且 大部分代码相同// 只有关键条件的代码不同, 因此 造成了 数据的 大量冗余,  那 如何改进呢?​// 利用所学--- 采用设计模式改进, 定义接口, 接口里定义抽象方法 返回boolean,采用不同的实现类来操作, 每个需求都是不同的实现类,/**定义接口 MyEmp<T>  定义 方法 boolean test(T t);*/// 定义接口public interface MyEmp<T>{boolean test(T t);}​​//定义实现类-- 按照薪资过滤public class FilterBySalary implements MyEmp<Emp>{@Overridepublic boolean test(Emp emp) {return emp.getSalary()>5000;}}​//定义实现类--按照年龄过滤public class FilterEmpByAge implements MyEmp<Emp>{@Overridepublic boolean test(Emp emp) {return emp.getAge()>30;}}​//测试类中 , 编写方法, 以接口作为参数private List<Emp> filterEmp(List<Emp> emps, MyEmp<Emp> filter){List<Emp> list2 = new ArrayList<>();for (Emp emp: emps) {if(filter.test(emp)){list2.add(emp);}}return list2;}// 测试方法 @Testpublic void test1() {​//按照年龄过滤List<Emp> emps = filterEmp(list,new FilterEmpByAge());System.out.println(emps);//按照薪资过滤List<Emp> emps2 = filterEmp(list,new FilterBySalary());System.out.println(emps2);}​// 以上问题 可以得到解决, 但目前是采用了 设计模块(策略模式) 进行 代码优化,缺点: 就是每次都要编写实现类,怎么再次优化?​//  优化上述问题,采用匿名内部类的方式,  只需要定义接口, 不需要 实现类​@Testpublic void test1() {​​List<Emp> emps = filterEmp(list, new MyEmp<Emp>() {@Overridepublic boolean test(Emp emp) {return emp.getSalary()>50000;}});System.out.println(emps);​List<Emp> emps2 = filterEmp(list, new MyEmp<Emp>() {@Overridepublic boolean test(Emp emp) {return emp.getAge()>30;}});System.out.println(emps2);}// 以上代码 关键的就是比较那一句, 显得代码不简洁, 因此能不能再次优化?   可以使用  Lambda表达式@Testpublic void test1() {​List<Emp> emps = filterEmp(list, emp->emp.getSalary()>5000);emps.forEach(System.out::println);​List<Emp> emps2 = filterEmp(list, emp->emp.getAge()>40);emps2.forEach(System.out::println);}​// 以上代码 还有使用 stream 再次优化list.stream().filter(e->e.getSalary()>5000).forEach(System.out::println);list.stream().filter(e->e.getAge()>40).forEach(System.out::println);

Lambda基本语法

在 java8 中引入了一个新的操作符 "->" , 箭头操作符, 箭头操作符 将Lambda表达式拆分为两部分:

左侧: Lambda表达式的参数列表

右侧: Lambda表达式的所需执行的功能, 即Lambda体

语法格式一: 无参数 无返回值-------- 举例 Runnable 接口中的void run() 方法

示例: (注意: 不能在lambda内部 修改定义在域外的局部变量, 否则会 编译错误)

 Runnable r = ()->System.out.println("hello lambda");r.run();

语法格式二: 有一个参数, 无返回值 -- Consumer接口中 void accept(T t) 方法

示例:

 Consumer<String> str = x->System.out.println(x); // 箭头左侧 x的小括号省略str.accept("nihao");// nihao赋值给x, 并进行打印

语法格式三: 若 只有一个参数,则参数的小括号 可不写

语法格式四: 有两个以上的参数 有返回值,并且 Lambda体中 有多条语句 , 则 {} 不可以省略--- Comparator接口 int compare(int x,int y)

举例:

 Comparator<Integer> comp = (x,y)->{System.out.println("语句1");return Integer.compare(x,y);};System.out.println(comp.compare(5, 7));

语法格式五:有两个以上的参数 有返回值,并且 Lambda体中 有一条语句 , 则 {} 和return 均可以省略

示例: Comparator<Integer> comp = (x,y)-> Integer.compare(x,y);

语法格式六: Lambda表达式的参数列表的数据类型可以省略不写, 因为 JVM编译器会通过上下文推断出参数的数据类型-- 即 类型推断

List<String> list = new ArrayList<>(); // 等号右侧 的 <> 里面不需要写类型了, 这也是 类型推断 , 1.7会报错

总结: 左右遇一 括号省, 左侧推断类型省,

函数式接口

Lambda表达式 需要函数式接口的 支持,

什么是函数式接口?

接口中只有一个抽象方法的接口 称为 函数式接口 ,可以使用 @FunctionalInterface 修饰, 检查是否是 函数式 接口

Lambda表达式练习题

1.调用Collections.sort()方法,通过定制排序比较两个Emp(先按年龄比,年龄相同 按姓名比),使用 Lambda 作为参数传递。 Emp.java 中 包含 姓名, 年龄 字段

 @Testpublic void test(){List<Emp> list = Arrays.asList(new Emp("王丽",3000,50),new Emp("李四",5000,50),new Emp("王丽2",3000,60),new Emp("李四2",3000,50));Collections.sort(list,(e1,e2)->{if(e1.getAge()==e2.getAge()){return e1.getName().compareTo(e2.getName());}else{return Integer.compare(e1.getAge(),e2.getAge());}});​list.forEach(System.out::println);}​

2.①声明函数式接口,接口中声明抽象方法,public String getValue(String str); ②声明类 TestLambda ,类中编写方法使用接口作为参数,将一个字符串转换成大写,并作为方法的返回值。 ③再将一个字符串的第2个和第4个索引位置进行截取子串。

 // 定义函数式 接口@FunctionalInterfacepublic interface MyTestLambda {String getValue(String str);}​// 定义测试类- 并添加 方法// 对s 执行 lambda的操作public String change(String s, MyTestLambda lambda){return lambda.getValue(s); //调用接口方法}​// 测试类-- 测试方法@Testpublic void test2(){//转大写String s = change("abc123",x->x.toUpperCase());System.out.println(s);// 提取 索引2-4 之间的内容String s1 = change("abc123",x->x.substring(2,5));System.out.println(s1);​}

3.①声明一个带两个泛型的函数式接口,泛型类型为<T, R> T为参数,R为返回值 ②接口中声明对应抽象方法。 ③在 TestLambda类中声明方法,使用接口作为参数,计算两个long型参数的和。④再计算两个long型参数的乘积。

 // 定义接口@FunctionalInterfacepublic interface MyFun<T,R> {R change(T t1,T t2);  // 因为要求对两个数 进行计算}​// 定义 测试类-- 添加方法 , 对 t1, t2 两数 做 lambda的操作public Long change3(Long t1,Long t2,MyFun<Long,Long> lambda){return lambda.change(t1,t2);}//定义测试类- 测试方法@Testpublic void test3(){//计算两数 和Long sum = change3(5l,10l,(x,y)->x+y);System.out.println(sum);//计算两数 积Long sum2 = change3(5l,10l,(x,y)->x*y);System.out.println(sum2);}​

本次练习发现 每次都需要自定义接口,实际上新特性已经提供了函数式接口,下节课学习下

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/615086.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JAVA毕业设计120—基于Java+Springboot+vue+uniapp的智能小程序商城管理系统(源代码+数据库+15000字论文)

毕设所有选题&#xff1a; https://blog.csdn.net/2303_76227485/article/details/131104075 基于JavaSpringbootvueuniapp的智能小程序商城管理系统(源代码数据库15000字论文)120 一、系统介绍 本项目前后端分离&#xff0c;分为用户、商家、管理员三种角色 1、用户&#…

redis stream restTemplate消息监听队列框架搭建

整体思路 1. pom增加redis依赖&#xff1b; 2. 消息监听器&#xff0c;实现StreamListener接口&#xff0c;处理消息到达逻辑&#xff1b; 3. 将消息订阅bean及监听器注册到配置中&#xff1b; 1. pom <?xml version"1.0" encoding"UTF-8"?> <…

Modern C++ std::mutex底层原理

前言 我时常有这样的疑问&#xff1a; std::mutex怎么就能保证后面的语句100%安全哪&#xff1f;CPU reordering就不会把这些语句重排到mutex前面执行&#xff1f;而且各个CPU都是有L1、L2缓存的&#xff0c;如果mutex后面要访问的的变量在这些缓存中怎么办&#xff1f; 带着…

openssl3.2 - 官方demo学习 - certs

文章目录 openssl3.2 - 官方demo学习 - certs概述笔记官方的实验流程mkcerts.sh - 整理ocsprun.sh - 整理ocspquery.sh - 整理从mkcerts.sh整理出来的27个.bata1_create_certificate_directly.cmda2_Intermediate_CA_request_first.cmda3_Sign_request_CA_extensions.cmda4_Ser…

C++_纯虚函数and抽象类

纯虚函数 and 抽象类 介绍纯虚函数抽象类纯抽象类(俗称&#xff1a;接口类) 介绍 本文主要介绍 纯虚函数 和 抽象类 纯虚函数 直接看源码吧&#xff0c;纯虚函数样式为&#xff1a;virtual 类型 函数名(参数表) 0; 源码 #include<iostream> #include<string> usi…

C++ 类 对象

C 在 C 语言的基础上增加了面向对象编程&#xff0c;C 支持面向对象程序设计。类是 C 的核心特性&#xff0c;通常被称为用户定义的类型。 类用于指定对象的形式&#xff0c;是一种用户自定义的数据类型&#xff0c;它是一种封装了数据和函数的组合。类中的数据称为成员变量&a…

MyBatis Plus wrapper A and (B or C or D)

Rt&#xff0c;怎么写这个wrapper呢&#xff1f; 例如我们有一个整数列表&#xff0c;数据库中存的是整数列表的字符串形式&#xff1a; list数据库中的存储1,2,3[1,2,3] 我们想查包含某几个数字的所有行。例如如果有1&#xff0c;那么结果中要有[1,2,3]、[1]。 // A Lambd…

在 WinForms 应用中使用 FtpWebRequest 进行文件操作和数据显示

在 WinForms 应用中使用 FtpWebRequest 进行文件操作和数据显示 引言 在企业级应用或桌面程序中&#xff0c;经常需要从远程服务器获取数据&#xff0c;并在用户界面上展示这些数据。本文将通过一个实际案例&#xff0c;演示如何在 Windows Forms 应用程序中使用 FtpWebReques…

互联网大厂职场各职级P6/P7和核心能力

目录 具体能力要求总结 具体能力要求 专业工匠 p5 被别人带领p6 独立完成项目全流程&#xff0c;指导 2-3 人 乐队指挥 p7 带行政团队 7-10 &#xff0c;项目团队&#xff0c;专项团队&#xff0c;复杂系统设计 1-3 个一般系统构成p8 领域专家 垂直 3 个团队 &#xff0c;横…

Qt/C++音视频开发63-设置视频旋转角度/支持0-90-180-270度旋转/自定义旋转角度

一、前言 设置旋转角度,相对来说是一个比较小众的需求,如果视频本身带了旋转角度,则解码播放的时候本身就会旋转到对应的角度显示,比如手机上拍摄的视频一般是旋转了90度的,如果该视频文件放到电脑上打开,一些早期的播放器可能播放的时候是躺着的,因为早期播放器设计的…

SQL-条件查询与聚合函数的使用

&#x1f389;欢迎您来到我的MySQL基础复习专栏 ☆* o(≧▽≦)o *☆哈喽~我是小小恶斯法克&#x1f379; ✨博客主页&#xff1a;小小恶斯法克的博客 &#x1f388;该系列文章专栏&#xff1a;重拾MySQL &#x1f379;文章作者技术和水平很有限&#xff0c;如果文中出现错误&am…

xbox无法登录、没有反应解决方法分享

如果你遇到了Xbox无法登录或没有反应的问题&#xff0c;可以尝试以下几种解决方法&#xff1a; 重启Xbox&#xff1a; 关闭Xbox。等待一分钟。重新启动Xbox。 检查Xbox Live服务状态&#xff1a; 访问Xbox Live服务状态网页&#xff08;官方网站&#xff09;检查是否有任何服务…

架构01 - 知识体系详解

架构&#xff0c;又称为知识体系&#xff0c;是指在特定领域或系统中的组织结构和设计原则。它涵盖了该领域或系统的核心概念、基础理论、方法技术以及实践经验等。架构的主要作用是提供一个全面且系统化的视角&#xff0c;帮助人们理解和应用相关知识&#xff0c;并指导系统的…

微信小程序开发WebSocket通讯

官方文档说明&#xff1a;入口 WebSocket连接的链接只支持wss加密方式&#xff0c;且只能用域名的方式 该域名还要在微信公众平台的小程序中登记才能使用&#xff0c;开发->开发管理->服务器域名->修改 该域名要和https使用的一致 以域名地址&#xff1a;dtu.aab…

Python基础(二十七、继承复写、注解)

文章目录 一、继承1.复写2.调用父类同名成员3.代码示例 二、注解1.变量注解2.函数注解3.Union联合注解语法如下&#xff1a;示例&#xff1a;注意事项&#xff1a; 一、继承 1.复写 子类继承父类的成员属性和成员方法后&#xff0c;如果对其“不满意”&#xff0c;那么可以进…

【Microsoft Copilot】手机端发布 ——GPT-4, DALL-E3 免费用

Microsoft Copilot 关于Microsoft CopilotMicrosoft Copilot 的特点1. 可以在手机端使用&#xff1a;2. 可以免费使用GPT-4。3. 可以无限制地使用GPT-4。4. 可以使用DALL-E3生成图片。5. 搜索功能6. 图像识别 Microsoft Copilot的缺点和注意事项1. 非常容易报错2. 不支持长篇聊…

树状结构查询 - 华为OD统一考试

OD统一考试 分值&#xff1a; 200分 题解&#xff1a; Java / Python / C 题目描述 通常使用多行的节点、父节点表示一棵树&#xff0c;比如&#xff1a; 西安 陕西 陕西 中国 江西 中国 中国 亚洲 泰国 亚洲 输入一个节点之后&#xff0c;请打印出来树中他的所有下层节点。 …

【Python_PySide6学习笔记(二十八)】基于PySide6实现移动窗体到屏幕中间位置

基于PySide6实现移动窗体到屏幕中间位置 基于PySide6实现移动窗体到屏幕中间位置前言一、背景介绍二、实现思路三、具体代码四、函数调用五、实现效果基于PySide6实现移动窗体到屏幕中间位置 前言 在 【Python_PySide2学习笔记(十)】移动窗体到屏幕中间位置 中介绍过移动窗…

靶机实战(10):OSCP备考之VulnHub Tre 1

靶机官网&#xff1a;Tre: 1[1] 实战思路&#xff1a; 一、主机发现二、端口发现&#xff08;服务、组件、版本&#xff09;三、漏洞发现&#xff08;获取权限&#xff09; 8082端口/HTTP服务 组件漏洞URL漏洞&#xff08;目录、文件&#xff09;80端口/HTTP服务 组件漏洞URL漏…

鸿蒙Harmony--状态管理器-@Observed装饰器和@ObjectLink装饰器详解

经历的越多&#xff0c;越喜欢简单的生活&#xff0c;干净的东西&#xff0c;清楚的感觉&#xff0c;有结果的事&#xff0c;和说到做到的人。把圈子变小&#xff0c;把语放缓&#xff0c;把心放宽&#xff0c;用心做好手边的事儿&#xff0c;该有的总会有的! 目录 一&#xff…