JDK新特性(Lambda表达式,Stream流)

Lambda表达式:

Lambda 表达式背后的思想是函数式编程(Functional Programming)思想。在传统的面向对象编程中,程序主要由对象和对象之间的交互(方法调用)构成;而在函数式编程中,重点在于函数的应用和组合。

以上就是Lambda表示的背后思想,做为了解即可

主要要看怎么用:

Lambda表达式的格式:

 ()->{}

        () : 重写方法的参数位置
        -> : 将参数传递到方法体中
        {} : 重写方法的方法体 

直接看代码:

public class Test03 {public static void main(String[] args) {ArrayList<Integer> list = new ArrayList<>();list.add(1);list.add(2);list.add(8);list.add(0);list.add(4);Collections.sort(list, new Comparator<Integer>() {@Overridepublic int compare(Integer o1, Integer o2) {return o1-o2;}});System.out.println(list);Collections.sort(list,((o1, o2) -> o1-o2));System.out.println(list);}
}

上面是用Comparator比较器来定义排序规则

下面则是用Lambda表达式

我们对照起来看,就能发现(o1,o2)就是方法的参数  -> 后面就是方法体。

Lambda表达式使用前提:

在使用Lambda表达式之前,我们需要确认必须是函数式接口做为参数传递:

什么是函数式接口?

有且只有一个抽象方法的接口,用@FunctionalInterface去检测

我们可以点击这个Comparator这个方法

 还有我们在线程章节经常用的Runnable接口

new Thread(()->System.out.println(Thread.currentThread().getName())).start();

这时候可能有人会想,Lambda表达式既然只能用函数式接口做为参数,那这个不是很鸡肋嘛

难道我要自己去写一个接口,里面专门再只放一个抽象方法,那这不是更麻烦了嘛

反正我刚刚学的时候,我确实是有这样的疑问

后面问了GPT,其实这个lambda表达式大部分应该是和后面的Stream流一起使用的


Stream流:

Stream流中的"流"不是特指"IO流",它是一种"流式编程"(编程方式),可以看做是"流水线"

个人对流的理解:

在我学习了流的大致用法之后,我其实觉得这个流就是一个操作数组和列表的工具类

里面提供了一系列的方法来操作数组和列表

下面介绍一下Stream流的方法:

Stream流的获取:

这个Stream流的获取就是把数组或者列表转化成流

public class Demo02Stream {public static void main(String[] args) {//1.针对集合:Collection中的方法//Stream<E> stream()ArrayList<String> list = new ArrayList<>();list.add("张三");list.add("李四");list.add("王五");Stream<String> stream = list.stream();System.out.println(stream);//2.针对数组:Stream接口中的静态方法://static <T> Stream<T> of(T... values)Stream<String> stream1 = Stream.of("金莲", "三上", "松下");System.out.println(stream1);}
}
常用方法:
  1. filter(Predicate):过滤方法,根据指定的条件对元素进行筛选。

  2. map(Function):映射方法,将元素按照指定的映射规则进行转换。

  3. forEach(Consumer):遍历方法,对流中的每个元素执行指定的操作。

  4. collect(Collectors):收集方法,将流中的元素收集到一个集合中。

  5. distinct():去除流中的重复元素。

  6. limit(long):截取流中的前几个元素。

  7. skip(long):跳过流中的前几个元素。

  8. count():统计流中元素的个数。

 直接上一段代码:

public class Test01 {public static void main(String[] args) {ArrayList<String> list = new ArrayList<>();list.add("张无忌");list.add("张三丰");list.add("张大彪");list.add("吕不韦");list.add("张三");list.add("赵姬");list.add("张翠山");list.add("嫪毐");//1:筛选出姓张的人System.out.println("筛选出姓张的人");list.stream().filter(s -> s.startsWith("张")).forEach(s -> System.out.print(s+" "));//2:筛选出姓张且名字为两个字的人System.out.println();System.out.println("筛选出姓张且名字为两个字的人");list.stream().filter(s -> s.startsWith("张")).filter(s -> s.length()==2).forEach(s -> System.out.print(s+" "));//3:计算列表的个数System.out.println();System.out.println("计算列表的个数");long count = list.stream().count();System.out.println(count);//4:返回流的前n个对象System.out.println();System.out.println("返回流的前2个对象");Stream<String> limit = list.stream().limit(2);limit.forEach(s -> System.out.print(s+" "));//5:跳过Stream流对象中的前n个元素,返回一个新的Stream流对象System.out.println();System.out.println("跳过Stream流对象中的前n个元素,返回一个新的Stream流对象");list.stream().skip(2).forEach(s-> System.out.print(s+" "));//6:两个流合成一个流System.out.println();System.out.println("两个流合成一个流");ArrayList<String> newlist = new ArrayList<>(Collections.nCopies(list.size(), ""));Collections.copy(newlist,list);System.out.println(newlist);Stream.concat(newlist.stream(),list.stream()).forEach(s -> System.out.print(s+" "));//7:转换流中的类型System.out.println();System.out.println("转换流中的类型");Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5, 6);stream.map(Integer -> Integer+"").forEach(s -> System.out.print(s+" "));}
}

下面来一个项目中的稍微复杂一点的代码加深印象:

在学这个JDK新特性这一章的时候,刚好在写伙伴匹配系统

下面这段鱼皮老师写的代码,我那个时候一直看不懂

现在算是能看懂了

这里的userList就是在数据库中查出来的所有用户列表

这里的tagNameList就是前端传过来的标签列表

所以这一段的逻辑就是根据前端传过来的标签列表进行查找有相同标签的用户

return userList.stream().filter(user -> {String tagsStr = user.getTags();Set<String> tempTagNameSet = gson.fromJson(tagsStr, new TypeToken<Set<String>>() {}.getType());tempTagNameSet = Optional.ofNullable(tempTagNameSet).orElse(new HashSet<>());for (String tagName : tagNameList) {if (!tempTagNameSet.contains(tagName)) {return false;}}return true;}).map(this::getSaftyUser).collect(Collectors.toList());

我们来分析一下整体的代码逻辑:

  1. 将userList转成流对象
  2. 转成流对象之后再从对应的用户中取出标签,因为我这里将标签定义成了一个String类型所以后面就将这个String转成了JSON格式的数据存到这个Set集合中
  3. 用了Optional来对这个转换后的集合做了一个判空处理,如果为空,就new一个空集合
  4. 然后遍历前端传过来的标签列表,如果判断标签列表中有和用户的标签列表不同的元素直接返回false,这样就被流给过滤掉了
  5. 接着再对符合要求的用户做一个映射:map(this::getSaftyUser),这个就相当于:map(this::getSaftyUser),将当前对象(this)的 getSaftyUser 方法应用到 Stream 中的每个元素上,当我们执行完这个filter方法之后,里面的用户就是我们需要的用户了,我们需要对用户进行一个脱敏将一些重要信息隐藏起来。
  6. 然后再将我们粉装好的流对象转成列表返回即可

如果上面的逻辑有点难,举个例子,因为我自己一开始也想了很久

比如有三个用户ABC

他们的标签分别是

A : Java ,男,大一

B : Python ,男,大二

C : C++ ,女,大三

然后这个时候我们传入的tagNameList是:男,大一

执行流程就是:我们会先将上面的三个用户取出来成一个列表就是userList

然后将这个列表转换成流对象,接着将这个列表中的每一个对象都执行后面Lambda表达式中的操作,有点像遍历一遍这个列表,比如将A用户的标签取出来 Java ,男,大一,封装成一个Set<String>集合,再遍历tagNameList这个列表:男,大一,挨个判断,男是否在这个集合中,在就继续判断大一这个标签是否在这个集合中,在就结束循环,返回true,就把这个A用户装到流中。

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

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

相关文章

打破运维“冷门槛“|暴雨液冷数据中心方案再升级

如果将数据比喻为驱动世界运转的新引擎&#xff0c;那数据中心便是为引擎提供源源不断动力的泵站。但随着泵站功率的日益增强&#xff0c;热浪成了不可避免的副产品。如何将数据热能转化为科技动能&#xff0c;是人工智能可持续发展的重要前提。 液冷技术&#xff0c;不仅可实现…

SD-WAN组网搭建5G备份方案实现方式

SD-WAN&#xff08;Software-Defined Wide Area Network&#xff0c;软件定义广域网&#xff09;结合5G作为备份链路是现代企业网络弹性策略的一部分&#xff0c;尤其是在需要高可用性和快速故障切换的场景下。以下是实现SD-WAN组网并集成5G备份方案的一般步骤&#xff1a; 1. …

【细如狗】记录一次使用MySQL的Binlog进行数据回滚的完整流程

文章目录 1 事情起因2 解决思路3 利用binlog进行数据回滚3.1 确认是否启用Binlog日志3.2 确认是否有binlog文件3.3 找到误操作的时间范围3.4 登录MySQL服务器查找binlog文件3.4.1 查询binlog文件路径3.4.2 找到binlog文件3.4.3 确认误操作被存储在哪一份binlog文件中 3.5 查看二…

用杰理芯片发不出100hz~1200hz频率的PWM波

思路&#xff1a; 问原厂工程师 回复&#xff1a; 看下是不是数据做除法的时候越界了&#xff0c;如果有用户手册&#xff0c;直接看下那几个定时器的寄存器算下就知道为什么 芯片&#xff1a; AD155A 行动&#xff1a; 相关文档和代码&#xff1a; TMR_PR&#xff1a;1…

打卡WAIC 2024!中兴的AI科技好牛

前几天去现场参观了2024世界人工智能大会展览&#xff08;WAIC 2024&#xff09;&#xff0c;突然感受到AI浪潮真的是在正在汹涌而来&#xff0c;大会上聚集了全球各种大型科技企业&#xff0c;“黑科技”一个接一个。中兴作为咱们中国企业&#xff0c;在这场大会上也很争气&am…

MySQL双主双从实现方式

双主双从&#xff08;MM-SS&#xff09; 前言 避免单一主服务器宕机&#xff0c;集群写入能力缺失 从 1 复制 主1 &#xff0c;从 2 复制 主 2 主 1 复制 主 2&#xff0c;主 2 复制主 1 也就是 主 1 和主 2 互为主从。主1主2互为主从&#xff0c; 是为了以下情景&#xff0c…

git使用以及理解

git练习网站 Learn Git Branching git操作大全Oh Shit, Git!?! git commit git branch name git merge bugFix 合并俩个分支 git rebase main git checkout headgit switch head 会导致HEAD分离 &#xff0c;就是指head->HEAD->c1 相对引用 ------------------- …

vue使用audio 音频实现播放与关闭(可用于收到消息给提示音效)

这次项目中因为对接了即时通讯 IM&#xff0c;有个需求就是收到消息需要有个提示音效&#xff0c;所以这里就想到了用HTML5 提供的Audio 标签&#xff0c;用起来也是很方便&#xff0c;首先让产品给你个提示音效&#xff0c;然后你放在项目中&#xff0c;使用Audio 标签&#x…

卡片式组件封装demo

效果视频&#xff1a; 卡片组件 样式还得细调~&#xff0c;时间有限&#xff0c;主要记录一下逻辑。 html结构&#xff1a; 目录 父组件数据处理数据格式 父组件的全部代码 子组件数据处理props参数 样式部分三个圆点点击三圆点在对应位置显示查看弹框点击非内容部分隐藏查看…

PHP连接MySQL数据库

PHP本身不具备操作MySQL数据库的能力&#xff0c;需要借助MySQL扩展来实现。 1、PHP加载MySQL扩展&#xff1a;php.ini文件中。&#xff08;不要用记事本打开&#xff09; 2、PHP中所有扩展都是在ext的文件夹中&#xff0c;需要指定扩展所在路径&#xff1a;extension_dir。 3、…

Mysql的语句执行很慢,如何分析排查?

1、检查服务器性能是否存在瓶颈 如果系统资源使用率比较高&#xff0c;比如CPU,硬盘&#xff0c;那访问肯定会慢&#xff0c;如果你发现是Mysl占比比较高&#xff0c;说明Mysql的读写频率高&#xff0c;如果本身网站访问量不大&#xff0c;说明你的sql参数&#xff0c;sql语句查…

【STC89C51单片机】串口通信

【STC89C51单片机】串口通信 串口简介1. 串口接线方式2. 通信过程 相关寄存器1. SBUF&#xff08;Serial Buffer Register&#xff09;2. SCON&#xff08;Serial Control Register&#xff09;3. PCON&#xff08;Power Control Register&#xff09;4. TCON&#xff08;Timer…

记录些Redis题集(4)

Redis 通讯协议(RESP) Redis 通讯协议&#xff08;Redis Serialization Protocol&#xff0c;RESP&#xff09;是 Redis 服务端与客户端之间进行通信的协议。它是一种二进制安全的文本协议&#xff0c;设计简洁且易于实现。RESP 主要用于支持客户端和服务器之间的请求响应交互…

第 8 章 虚拟文件系统(2)

目录 8.3 VFS结构 8.3.1 结构概观 8.3.2 inode 本专栏文章将有70篇左右&#xff0c;欢迎关注&#xff0c;查看后续文章。 8.3 VFS结构 8.3.1 结构概观 VFS组成部分&#xff1a; 1. 文件。 2. 文件系统。 1. 文件的表示 inode&#xff1a;包含文件信息及数据存储位置。 上…

001、Mac系统上Stable Diffusion WebUI环境搭建

一、目标 如标题所述&#xff0c;在苹果电脑&#xff08;Mac&#xff09;上搭建一套Stable Diffusion本地服务&#xff0c;以实现本地AI生图目的。 二、安装步骤 1、准备源码【等价于准备软件】 # 安装一系列工具库&#xff0c;包括cmake,protobuf,rust,python3.10,git,wge…

Nginx、LNMP万字详解

目录 Nginx 特点 Nginx安装 添加Nginx服务 Nginx配置文件 全局配置 HTTP配置 状态统计页面 Nginx访问控制 授权用户 授权IP 虚拟主机 基于域名 测试 基于IP 测试 基于端口 测试 LNAMP 解析方式 LNMP转发php-fpm解析 Nginx代理LAMP解析 LNMP部署示例 实…

linux之mysql安装和使用

数据库之Mysql 一、数据库介绍 1、什么是数据库 数据库就是一个存放计算机数据的仓库,这个仓库是按照一定的数据结构(数据结构是指数据的组织形式或数据之间的联系)来对数据进行组织和存储的,可以通过数据库提供的多种方法来管理其中的数据。 2、数据库的种类 最常用的…

微分段Microsegmentation简介

目录 微分段Microsegmentation简介什么是微分段&#xff1f;微分段的防范措施微分段的防护层级 基于网络的微分段微分段基本工作机制微分段的角色VxLAN的额外字段 业务链分组与传输策略场景1&#xff1a;三层报文本地转发场景场景2&#xff1a;三层报文跨设备转发场景 微分段的…

中国贸易外经统计年鉴(2006-2023年)

数据年限&#xff1a;2006-2023年全 数据格式&#xff1a;pdf、excel、caj 数据内容&#xff1a;《中国贸易外经统计年鉴》是一部反映中国国内贸易、对外经济贸易和旅游业发展情况的资料性年刊。收录了 中国国内消费品市场、批发和零售业、住宿和餐饮业、国际收支、对外贸易、利…

具有I2S输出的多模数字麦克风ICS-43434咪头LR引脚接地或电源WS接LRCLK

外观和丝印 ICS-43434麦克风3.50 mm x 2.65 mm&#xff0c;丝印为434&#xff08;图片不好拍&#xff0c;隐约可见434&#xff09; 一般描述 ICS-43434 是一款数字 IS 输出底部收音孔麦克风。完整的 ICS-43434 解决方案包括 MEMS 传感器、信号调理、模数转换器、抽取和抗混叠滤…