Java 干净的Stream,Lambda代码写法

目录

  • 一. 前期准备
    • 1.1 各种实体类
    • 1.2 生成`List<CommonUser>`的方法
    • 1.3 需求
  • 二. 难以阅读的Lambda表达式
  • 三. 干净的Lambda表达式
  • 四. 效果


一. 前期准备

1.1 各种实体类

⏹Address实体类,用来存储地址

import lombok.Builder;
import lombok.Getter;@Builder
@Getter
public class Address {private String province;private String city;private String home;
}

⏹CommonUser 实体类,用来存放普通用户的信息

import lombok.Builder;
import lombok.Getter;
import lombok.Setter;import java.util.List;@Builder
@Getter
@Setter
public class CommonUser {private String name;private Integer gender;private Integer age;// 一个用户可能有多个地址private List<Address> addressList;
}

⏹SimpleUser 实体类,用来存放精简之后的用户信息

import lombok.Data;@Data
public class SimpleUser {private String name;private Integer age;private String province;
}

1.2 生成List<CommonUser>的方法

private List<CommonUser> createCommonUserList() {List<Address> addressList1 = Arrays.asList(Address.builder().province("山东省").city("聊城市").home("村1").build(),Address.builder().province("山西省").city("X城市").home("村2").build());CommonUser commonUser1 = CommonUser.builder().name("张三").gender(1).age(18).addressList(addressList1).build();List<Address> addressList2 = Arrays.asList(Address.builder().province("河南省").city("濮阳市").home("村3").build(),Address.builder().province("河北省").city("Y城市").home("村4").build());CommonUser commonUser2 = CommonUser.builder().name("李四").gender(2).age(19).addressList(addressList2).build();List<Address> addressList3 = Arrays.asList(Address.builder().province("海南省").city("海口市").home("村5").build(),Address.builder().province("海北省").city("Z城市").home("村6").build());CommonUser commonUser3 = CommonUser.builder().name("王五").gender(1).age(34).addressList(addressList3).build();List<Address> addressList4 = Arrays.asList(Address.builder().province("东北省").city("沈阳市").home("村7").build(),Address.builder().province("东南省").city("U城市").home("村8").build());CommonUser commonUser4 = CommonUser.builder().name("赵六").gender(1).age(26).addressList(addressList4).build();return Arrays.asList(commonUser1, commonUser2, commonUser3, commonUser4);
}

1.3 需求

⏹内容
从存放CommonUser实体类的List中过滤出性别为1,且 45 >= 年龄 >= 19 的用户,并将姓名,年龄,第一个地址的省份等信息放入SimpleUser实体类中,返回一个新List。


二. 难以阅读的Lambda表达式

  • 核心处理就只是 .stream().filter().map().sorted().collect()
  • 整个代码中充满了各种 ->和花括号。
  • 各种业务处理逻辑和.filter().map()混杂在一起,显得臃肿,不宜阅读。
  • 如果之后业务发生了变更,乍一看不知道从何着手。
private List<SimpleUser> dirtyLambda(List<CommonUser> commonUserList) {List<SimpleUser> simpleUserList = commonUserList.stream().filter(user -> {return user.getGender().equals(1)&& user.getAge() >= 19 && user.getAge() <= 40;}).map(user -> {SimpleUser simpleUser = new SimpleUser();simpleUser.setName(user.getName());simpleUser.setAge(user.getAge());Optional<Address> optionalAddress = user.getAddressList().stream().findFirst();if (optionalAddress.isPresent()) {simpleUser.setProvince(optionalAddress.get().getProvince());}return simpleUser;}).sorted(Comparator.comparingInt(SimpleUser::getAge)).collect(Collectors.toList());return simpleUserList;
}

三. 干净的Lambda表达式

  • 可以看到在cleanLambda方法中的主干结构很清楚。
  • .filter().map()中所设计的业务处理都被抽取出来。
  • 整个代码中没有 箭头->花括号{}
  • .filter()相关的业务处理除了可以抽取为静态方法外,还可以抽取成谓词
// 根据性别和年龄过滤用户
private static boolean filterUser(CommonUser user) {return user.getGender().equals(1) && user.getAge() >= 19 && user.getAge() <= 40;
}// 将CommonUser中的内容抽取到SimpleUser中
private static SimpleUser getSimpleUser(CommonUser user) {SimpleUser simpleUser = new SimpleUser();simpleUser.setName(user.getName());simpleUser.setAge(user.getAge());// Optional的IF判断的简化写法Optional<Address> optionalAddress = user.getAddressList().stream().findFirst();optionalAddress.ifPresent(address -> simpleUser.setProvince(address.getProvince()));return simpleUser;
}// 干净的Lambda表达式
private List<SimpleUser> cleanLambda(List<CommonUser> commonUserList) {// 也可以将过滤条件抽取为【谓词】Predicate<CommonUser> filterUser = user -> user.getGender().equals(1) && user.getAge() >= 19 && user.getAge() <= 40;List<SimpleUser> simpleUserList = commonUserList.stream()// 使用静态方法进行过滤.filter(JmwApplication::filterUser)// 也可以使用谓词进行过滤 😒※此处只是为了展示谓词的用法.filter(filterUser).map(JmwApplication::getSimpleUser)// 根据年龄进行排序.sorted(Comparator.comparingInt(SimpleUser::getAge))// 收集为List.collect(Collectors.toList());return simpleUserList;
}

四. 效果

在这里插入图片描述

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

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

相关文章

力扣刷题记录(17)LeetCode:416、1049

416. 分割等和子集 可以将该问题看成是一个背包问题。背包的容量就是nums数组和的一半。我们如果能够将背包装满就意味着可以将数组分割成两个元素和相等的子集。 1.确定dp[i]的含义 索引i表示背包的容量&#xff0c;dp[i]表示当前容量能够装载的最大值 2.确定动态转移方程 …

Uniapp + Vue3 封装请求工具挂载全局

新建request.js工具类 const http {// baseUrl 地址baseUrl: http://localhost:8080,// 请求方法request(config) {// config&#xff1a;请求配置对象&#xff0c;具体参照uniapp文档config beforeRequest(config)// 请求地址拼接config.url this.baseUrl config.url// 异…

前端性能优化四:精简html代码

1. 精简HTML代码: ①. 减少HTML嵌套,层级关系缩小.②. 减少DOM节点数.③. 减少无语义代码:a. 如:<div class"clear"></div>消除浮动,或者用css的方式处理.④. 删除http或者https:a. 如果URL的协议头恶化当前页面的协议头一致的.b. 或者此URL在多个协议头…

Linux-----14、vim

# vim Linux平台下的文本编辑器&#xff1a; emacs、nano、gedit、vi、vim vi&#xff08;visual editor&#xff09;编辑器通常被简称为vi&#xff0c;它是Linux和Unix系统上最基本的文本编辑器&#xff0c;类似于Windows 系统下的记事本。学会它后&#xff0c;我们将在Linu…

Vue数组变更方法和替换方法

一、可以引起UI界面变化 Vue 将被侦听的数组的变更方法进行了包裹&#xff0c;所以它们也将会触发视图更新。这些被包裹过的方法包括&#xff1a; push()pop()shift()unshift()splice()sort()reverse() 以上七个数组都会改变原数组&#xff0c;下面来分别讲解它们的区别&…

【Unity】【WebRTC】如何用Unity而不是浏览器接收远程画面

【背景】 之前几篇我们讨论了如何设置信令服务器&#xff0c;如何发送画面给远端以及如何用浏览器查看同步画面&#xff0c;今天来讨论如何实现Unity内部接收画面。 看本篇之前请先看过之前将web服务器设置和基本远程画面功能的几篇博文。&#xff08;同专栏下查看&#xff09…

Linux 脚本监控cpu输出到日志,每秒执行1次

vi test.sh while true; doecho date "%Y-%m-%d %H:%M:%S"", "$(top -bn1 | grep "Cpu(s)" | awk {print $1$2$3}) >> cpu_log.txtsleep 1 done top -bn1 | grep "Cpu(s)" 表示打印top命令的输出结果。 sleep 1 表示睡眠1秒…

TDengine 签约中船九院,助力航运业智能化转型升级

在大数据时代背景下&#xff0c;船舶智能化已经成为船舶制造与航运领域发展的必然趋势。智能船舶作为《中国制造 2025》中明确重点发展的领域&#xff0c;代表了船舶未来的方向&#xff0c;对于航运业的转型升级至关重要。其中&#xff0c;大数据的处理和运用成为船舶智能化转型…

每日一题(LeetCode)----栈和队列--逆波兰表达式求值

每日一题(LeetCode)----栈和队列–逆波兰表达式求值 1.题目&#xff08;150. 逆波兰表达式求值&#xff09; 给你一个字符串数组 tokens &#xff0c;表示一个根据 逆波兰表示法 表示的算术表达式。 请你计算该表达式。返回一个表示表达式值的整数。 注意&#xff1a; 有效的算…

如何通过宝塔面板搭建一个MySQL数据库服务并实现无公网ip远程访问?

文章目录 前言1.Mysql服务安装2.创建数据库3.安装cpolar3.2 创建HTTP隧道 4.远程连接5.固定TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址 前言 宝塔面板的简易操作性,使得运维难度降低,简化了Linux命令行进行繁琐的配置,下面简单几步,通过宝塔面板cp…

python-dlib实现人脸提取和分割

效果 → 参考资料和资源 GitHub - Onwaier/SegfaceAndAlignByDlib: 用dlib实现脸部分割和人脸对齐 shape_predictor_68_face_landmarks.dat 下载地址_shape_predictor_68_face_landmarks.dat下载-CSDN博客 未运行的参考资料 dlib实现脸部分割与人脸对齐 - 知乎 py代码 &…

自定义通用物联网网关的MIB结构的参考

文章目录 说明参考代码开源项目地址 说明 由于时间有限&#xff0c;本人精力有限&#xff0c;所以给出的网关MIB结构&#xff0c;并非完美&#xff01;本文网关MIB结构的结构定义构思在使用MIB builder自定义物联网网关的MIB结构欢迎小伙伴&#xff0c;点赞、关注和评论&#…

【Lidar】Open3D点云DBSCAN聚类算法:基于密度的点云聚类(单木分割)附Python代码

1 DBSCAN算法介绍 DBSCAN聚类算法是一种基于密度的聚类算法&#xff0c;全称为“基于密度的带有噪声的空间聚类应用”&#xff0c;英文名称为Density-Based Spatial Clustering of Applications with Noise。 DBSCAN聚类算法能够发现任意形状的类别&#xff0c;并且对噪音数据具…

全网最全pytest大型攻略,单元测试学这就够了!

pytest 是一款以python为开发语言的第三方测试&#xff0c;主要特点如下&#xff1a; 比自带的 unittest 更简洁高效&#xff0c;兼容 unittest框架支持参数化可以更精确的控制要测试的测试用例丰富的插件&#xff0c;已有300多个各种各样的插件&#xff0c;也可自定义扩展&am…

数字化时代的智能支持:亚马逊云科技轻量应用服务器技术领先

轻量应用服务器是一种简化运维、门槛低的弹性服务器&#xff0c;它的"轻"主要体现在几个方面&#xff1a;开箱即用、应用优质、上手简洁、投入划算、运维简便以及稳定可靠。相较于普通的云服务器&#xff0c;轻量应用服务器简化了云服务的操作难度、使用和管理流程&a…

mysql:查询服务器当前打开的连接数量

使用命令show global status like Threads_connected;可以查询mysql服务器当前打开的连接数量。 例如&#xff0c;查询如下&#xff1a; 启动应用&#xff0c;连接数据库&#xff0c;占用了1个连接&#xff0c;再查询如下&#xff1a; 由输出可以看出&#xff0c;打开的连接…

低代码和纯代码:双向奔赴,共创未来ing……

低代码开发是近年来迅速崛起的软件开发方法&#xff0c;让编写应用程序变得更快、更简单。有人说它是美味的膳食&#xff0c;让开发过程高效而满足&#xff0c;但也有人质疑它是垃圾食品&#xff0c;缺乏定制性与深度。你认为低代码到底是美味的膳食还是垃圾食品呢&#xff0c;…

【方案】如何利用大数据+云计算技术打造智能环境监控系统?

小编在之前的文章中也提到过基于云计算的环境智能监控系统是什么样的&#xff0c;收到了很多朋友的关注&#xff0c;今天小编就再次根据智能监控为切入点&#xff0c;深入讲解智能环境监控系统方案的详细落实。 1、传感器节点&#xff1a;首先需要选择适合应用场景的各类传感器…

Actuator内存泄露及利用Swagger未授权自动化测试实现

目录 0x00 前言 0x01 Actuator 泄露及利用 1、Actuator heapdump 内存泄露 2、知道泄露后如何进一步利用 3、如何发现 Actuator 泄露&#xff08;白盒/黑盒&#xff09; 0x02 Swagger自动化测试 1、什么是Swagger&#xff1f; 2、PostmanBurpSuiteXray 联动 3、思考 0x…

JavaAwtSwing的JFrame的pack()方法,容器适配子组件大小,笔记231220

pack()是extends自Window类的方法 使此窗口的大小适合其子组件的首选大小和布局。如果其中一个尺寸小于上一次调用setMinimumSize方法指定的最小尺寸&#xff0c;则会自动放大窗口的宽度和高度。 如果窗口和/或其所有者还不可显示&#xff0c;则在计算首选大小之前&#xff0…