实际项目Java1.8流处理, Optional常见用法

news2024/11/20 6:27:37

流处理

相信大家肯定遇到过列表需要按某个字符进行排序, 这时我们用流处理就可以很优雅的实现该功能了

convert.setItems(convert.getItems().stream()
    .sorted(Comparator.comparing(
        item -> StringUtils.defaultIfBlank(item.getWarehouseName(), ""),
        Collator.getInstance(Locale.CHINESE)
    ))
    .collect(Collectors.toList()));

解释

  1. StringUtils.defaultIfBlank

    • StringUtils.defaultIfBlank(item.getWarehouseName(), "") 会返回 item.getWarehouseName() 如果它不是空或 null,否则返回空字符串 ""
  2. Comparator.comparing

    • Comparator.comparing 方法用于创建一个比较器,这里使用 Collator.getInstance(Locale.CHINESE) 来确保中文字符的正确排序。
  3. collect(Collectors.toList())

    • 将排序后的流收集为一个新的列表,并设置回 convert 对象的 items 属性。

或者在列表中对手机号进行加密等操作

                // 手机号加密
                List<GetPackageListRes.GetPackageListInnerPackage> items = convert.getItems().stream()
                        .peek(item -> item.setSenderMobile(StringUtils.isBlank(item.getSenderMobile()) ? "" : AppAesUtils.aesEncrypt(item.getSenderMobile())))
                        .collect(Collectors.toList());

在Java 8的Stream API中,peekmap 是两个常用的中间操作方法,它们的功能和用途有所不同。下面是它们的区别和用法示例:

peek 方法

用途
  • peek 主要用于调试目的,它允许你在流的处理过程中打印或检查每个元素,而不改变元素本身。
  • peek 不会对流中的元素进行任何转换或修改,它只是提供了一个钩子,让你可以在流的处理过程中插入一些操作(通常是日志记录或断言)。
方法签名
Stream<T> peek(Consumer<? super T> action)
示例
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);

List<Integer> result = numbers.stream()
                             .peek(System.out::println)  // 打印每个元素
                             .filter(n -> n % 2 == 0)
                             .collect(Collectors.toList());

System.out.println(result);  // 输出: [2, 4]

在这个示例中,peek 用于打印流中的每个元素,但不会改变它们。最终的结果是 [2, 4]

map 方法

用途
  • map 用于将流中的每个元素转换为另一个形式。它接受一个函数作为参数,并将该函数应用于流中的每个元素,生成一个新的流。
  • map 是一种转换操作,它可以改变流中元素的类型或值。
方法签名
<R> Stream<R> map(Function<? super T, ? extends R> mapper)
示例
List<String> words = Arrays.asList("apple", "banana", "cherry");

List<Integer> lengths = words.stream()
                             .map(String::length)  // 将每个字符串转换为其长度
                             .collect(Collectors.toList());

System.out.println(lengths);  // 输出: [5, 6, 6]

在这个示例中,map 将每个字符串转换为其长度,生成一个新的流,最终的结果是 [5, 6, 6]

总结

  • peek

    • 用于调试,不改变流中的元素。
    • 主要用于在流的处理过程中插入一些操作,如打印日志。
    • 返回类型与输入类型相同。
  • map

    • 用于转换,可以改变流中的元素。
    • 接受一个函数作为参数,将该函数应用于流中的每个元素。
    • 返回类型可以与输入类型不同。

示例对比

假设我们有一个列表,包含一些 GetSelfPickupAddressesListRes 对象,我们希望在处理过程中打印每个对象,并根据 selfPickupType 修改 receiverAddr

使用 peekmap
List<GetSelfPickupAddressesListRes> listRes = ...; // 初始化列表

List<GetSelfPickupAddressesListRes> processedListRes = listRes.stream()
                                                             .peek(res -> System.out.println("Processing: " + res))
                                                             .map(res -> {
                                                                 if (GetSelfPickupAddressesListRes.SELF_PICKUP_TYPE_CABINET.equals(res.getSelfPickupType())) {
                                                                     res.setReceiverAddr(res.getReceiverAddr() + "(自提柜)");
                                                                 } else if (GetSelfPickupAddressesListRes.SELF_PICKUP_TYPE_POINT.equals(res.getSelfPickupType())) {
                                                                     res.setReceiverAddr(res.getReceiverAddr() + "(自提点)");
                                                                 }
                                                                 return res;
                                                             })
                                                             .collect(Collectors.toList());

// 打印处理后的结果
processedListRes.forEach(System.out::println);

在这个示例中:

  • peek 用于在处理每个对象时打印一条消息。
  • map 用于根据 selfPickupType 修改 receiverAddr

通过这种方式,你可以同时使用 peek 进行调试,并使用 map 进行转换。

Optional常见用法

在日常项目开发中, 我们少不了对应信息进行脱敏加密, 如果对应信息从服务调用而来, 这时我们就需要对信息进行判空处理。

在Java 8中,Optional 类提供了一种处理可能为 null 的值的优雅方式。filtermap 方法是 Optional 类中非常有用的两个方法,它们分别用于过滤和转换值。下面是对这两个方法的详细解释和示例。

filter 方法

用途
  • filter 方法用于根据给定的谓词(Predicate)来决定是否保留 Optional 中的值。
  • 如果谓词返回 true,则 Optional 中的值保持不变;如果谓词返回 false,则 Optional 变为 Optional.empty()
方法签名
Optional<T> filter(Predicate<? super T> predicate)
示例
Optional<String> optionalValue = Optional.of("1234567890");
Optional<String> filteredValue = optionalValue.filter(s -> s.length() > 5);

System.out.println(filteredValue.orElse("Default Value"));  // 输出: 1234567890

在这个示例中,filter 方法检查字符串的长度是否大于5。因为 "1234567890" 的长度是10,所以 filteredValue 仍然是 Optional.of("1234567890")

map 方法

用途
  • map 方法用于将 Optional 中的值转换为另一种类型。
  • 它接受一个函数(Function),并将该函数应用于 Optional 中的值,生成一个新的 Optional
方法签名
<U> Optional<U> map(Function<? super T, ? extends U> mapper)
示例
Optional<String> optionalValue = Optional.of("1234567890");
Optional<Integer> mappedValue = optionalValue.map(s -> s.length());

System.out.println(mappedValue.orElse(0));  // 输出: 10

在这个示例中,map 方法将字符串转换为其长度,生成一个新的 Optional<Integer>

综合示例

结合 filtermap 方法,我们可以更优雅地处理可能为 null 或空字符串的情况,并进行转换。以下是你提供的代码片段的详细解释:

dto.setReceiverFixtel(
    Optional.ofNullable(res.getReceiverFixtel())
            .filter(StringUtils::isNotBlank)
            .map(CommonUtil::overlayPhone)
            .orElse("")
);
解释
  1. Optional.ofNullable(res.getReceiverFixtel())

    • 创建一个 Optional 对象,如果 res.getReceiverFixtel() 返回 null,则 OptionalOptional.empty()
  2. .filter(StringUtils::isNotBlank)

    • 使用 filter 方法检查 Optional 中的值是否不是空字符串。如果值是空字符串或 null,则 Optional 变为 Optional.empty()
  3. .map(CommonUtil::overlayPhone)

    • 使用 map 方法将 Optional 中的值转换为电话号码的遮罩形式。CommonUtil::overlayPhone 是一个静态方法,假设它接受一个字符串并返回一个遮罩后的字符串。
  4. .orElse("")

    • 如果 OptionalOptional.empty(),则返回默认值 ""。否则,返回转换后的值。
再举个例子,对值进行判空后类型转换:
        Optional<String> length = Optional.ofNullable(waybillBaseDto.getLength()).map(String::valueOf);
        Optional<String> width = Optional.ofNullable(waybillBaseDto.getWidth()).map(String::valueOf);
        Optional<String> height = Optional.ofNullable(waybillBaseDto.getHeight()).map(String::valueOf);

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

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

相关文章

([LeetCode仓颉解题报告] 661. 图片平滑器

[LeetCode仓颉解题报告] 661. 图片平滑器 一、 题目1. 题目描述2. 原题链接 二、 解题报告1. 思路分析2. 复杂度分析3. 代码实现 三、 本题小结四、 参考链接 一、 题目 1. 题目描述 2. 原题链接 链接: 661. 图片平滑器 二、 解题报告 1. 思路分析 由于只需要3*39个格子&am…

算法-二叉树(从理论知识到力扣题,递归、迭代。)

二叉树 一、二叉树理论知识1、种类a.满二叉树b.完全二叉树c.二叉搜索树d.平衡二叉搜索树 2、java对于树的理解3、存储a.链式存储&#xff08;常用&#xff09;b.数组存储 4、遍历方式a.深度优先搜索b.广度优先搜索 5、树的定义&#xff08;链式&#xff09; 二、力扣题解写题思…

数字后端零基础入门系列 | Innovus零基础LAB学习Day11(Function ECO流程)

###LAB 20 Engineering Change Orders (ECO) 这个章节的学习目标是学习数字IC后端实现innovus中的一种做function eco的flow。对于初学者&#xff0c;如果前面的lab还没掌握好的&#xff0c;可以直接跳过这节内容。有时间的同学&#xff0c;可以熟悉掌握下这个flow。 数字后端…

打开AI的黑盒子——机器学习可解释性!

2024深度学习发论文&模型涨点之——机器学习可解释性 现在以深度学习为主的方法在各个领域都已经next level了&#xff0c;但是如何解释我们的模型仍然是个难题。为什么得到这样的结果往往和结果本身一样重要。因此&#xff0c;个人觉得Explainable AI (XAI)依然会是近些年…

白蚁自动化监测系统的装置和优势

一、背景 在当今社会&#xff0c;随着科技的飞速发展&#xff0c;智能化、自动化技术在各个领域的应用日益广泛&#xff0c;白蚁自动化监测系统作为一种高效、精准的白蚁防控手段&#xff0c;正逐步成为行业内的主流趋势&#xff0c;既是文物古建水利堤坝等预防性保护的要求&a…

HarmonyOs鸿蒙开发实战(10)=>状态管理-对象数组的属性数据变更刷新UI,基于@Observed 和@ObjectLink装饰器

1.条件:基于HarmonyOs5.0.0版本. 2.功能要求&#xff1a;横向列表中每个景点的名称&#xff08;eg: 第二项 “灵隐寺” &#xff09;, 在通过天气接口拿到对应天气后&#xff0c;拼接到名称后面 > 变成&#xff08;“灵隐寺” 天气&#xff09;&#xff09; 3.老规矩先看…

详细描述一下Elasticsearch搜索的过程?

大家好&#xff0c;我是锋哥。今天分享关于【详细描述一下Elasticsearch搜索的过程&#xff1f;】面试题。希望对大家有帮助&#xff1b; 详细描述一下Elasticsearch搜索的过程&#xff1f; Elasticsearch 的搜索过程是其核心功能之一&#xff0c;允许用户对存储在 Elasticsea…

FPGA理论基础1一一一简单的硬件知识

FPGA理论基础一一一简单的硬件知识 文章目录 FPGA理论基础一一一简单的硬件知识一、BANK1.1、BANK01.2、BANK141.3、MGTBANK二、上电时序三 认识命名规则 一、BANK 7系列的FPGA中&#xff0c;BANK分为HPBank、HRBank、HDBank;但并不是一个FPGA中会同时包含HP/HR/HDBank HP(Hi…

【Mysql】函数---控制流函数

1、if逻辑判断语句 格式 解释 if(expr,v1,v2) 如果表达式expr成立&#xff0c;返回结果v1&#xff0c;否则返回v2 ifnull(v…

【Java企业级开发技术】【MyBatis入门程序】上机实验

Java企业级开发技术-MyBatis入门程序-上机实验 1 实验目的 掌握Mybatis环境配置熟悉Mybatis基本开发流程能够开发简单的入门程序 2 实验内容 创建1个学生(student)表,包括学号(num)&#xff0c;姓名(name)&#xff0c;年龄(age)&#xff0c;通过Mybatis框架实现如下数据库访…

python之sklearn--鸢尾花数据集之数据降维(PCA主成分分析)

python之sklearn–鸢尾花数据集之数据降维(PCA主成分分析) sklearn库&#xff1a;Scikit - learn&#xff08;sklearn&#xff09;是一个用于机器学习的开源 Python 库。它建立在 NumPy、SciPy 和 matplotlib 等其他科学计算库之上&#xff0c;为机器学习的常见任务提供了简单…

已解决-idea创建Maven项目卡死,一动不动

先说原因&#xff1a; idea创建maven项目时要从中央仓库下载archetype-catalog.xml(文件较大&#xff0c;14.8M)导致卡住 所以一种解决方案是&#xff0c;手动将这个文件下载到本地的仓库目录下即可解决 文件下载地址&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1…

vulhub之log4j

Apache Log4j Server 反序列化命令执行漏洞(CVE-2017-5645) 漏洞简介 Apache Log4j是一个用于Java的日志记录库,其支持启动远程日志服务器。Apache Log4j 2.8.2之前的2.x版本中存在安全漏洞。攻击者可利用该漏洞执行任意代码。 Apache Log4j 在应用程序中添加日志记录最…

基于Springboot+Vue的农产品销售系统 (含源码数据库)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 这个系…

Ascend C算子性能优化实用技巧05——API使用优化

Ascend C是CANN针对算子开发场景推出的编程语言&#xff0c;原生支持C和C标准规范&#xff0c;兼具开发效率和运行性能。使用Ascend C&#xff0c;开发者可以基于昇腾AI硬件&#xff0c;高效的实现自定义的创新算法。 目前已经有越来越多的开发者使用Ascend C&#xff0c;我们…

矩阵论在深度学习中的应用

摘要&#xff1a; 本文深入探讨了矩阵论在深度学习领域的广泛应用。首先介绍了深度学习中数据表示和模型结构与矩阵的紧密联系&#xff0c;接着详细阐述了矩阵论在神经网络训练算法优化、卷积神经网络&#xff08;CNN&#xff09;、循环神经网络&#xff08;RNN&#xff09;及其…

表格的选择弹窗,选中后返显到表格中

项目场景&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a; 表格的下拉框可以直接显示选项&#xff0c;那如果选择框不是下拉的&#xff0c;而是弹窗&#xff0c;那么在表格中如何返显呢&#xff1f; 问题描述 如上图所示&#xff0c;点击表格中的选择&#xf…

HCIP --OSI七层参考模型回顾、TCP/UDP协议复习

目录 一、OSI 二、重要的三个协议报头格式 名词注解 MTU 封装 解封装 PDU ARP DNS TCP/IP与OSI的区别 三、数据包转发过程 四、获取目标ip地址方式 五、获取目标mac地址方式 六、交换机的工作原理 七、TCP/UDP TCP&#xff08;Transmission Control Protocol&a…

【深度学习|目标跟踪】DeepSort 详解

DeepSort详解 1、Sort回顾2、DeepSort的状态向量3、DeepSort的外观特征4、DeepSort的track状态5、DeepSort的代价矩阵以及门控矩阵6、DeepSort的级联匹配 1、Sort回顾 查看这篇博客 2、DeepSort的状态向量 Sort中的卡尔曼滤波使用的目标的状态向量是一个7维的向量&#xff0c…

无人机在森林中的应用!

一、森林资源调查 无人机可以利用遥感技术快速获取所需区域高精度的空间遥感信息&#xff0c;对森林图斑进行精确区划。相较于传统手段&#xff0c;无人机调查具有低成本、高效率、高时效的特点&#xff0c;尤其在地理环境条件不好的区域&#xff0c;调查人员无法或难以到达的…