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

流处理

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

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.mzph.cn/pingmian/61566.shtml

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

相关文章

苹果Siri将搭载大型语言模型,近屿智能抢占AIGC大模型人才培养高地

据媒体报道&#xff0c;苹果公司正在研发一款全新升级、更加智能且对话能力显著提升的Siri&#xff0c;意在超越OpenAI的ChatGPT及其他语音服务。 报道指出&#xff0c;新一代Siri将搭载更为先进的大型语言模型&#xff08;LLM&#xff09;&#xff0c;苹果期望其能够进行连续…

【1.4 Getting Started--->Support Matrix】

主页&#xff1a;支持矩阵 这些支持矩阵概述了 TensorRT API、解析器和层支持的平台、特性和硬件功能。 Support Matrix Abstract 这些支持矩阵概述了 TensorRT API、解析器和层所支持的平台、功能和硬件功能。 有关之前发布的 TensorRT 文档&#xff0c;请参阅 TensorRT 档…

WPF中如何让Textbox显示为一条直线

由于Textbox直接使用是一条直线 设置如下代码 可以让Textbox变为直线输入 <Style TargetType"TextBox"x:Key"UsernameTextBoxStyle"><Setter Property"Template"><Setter.Value><ControlTemplate TargetType"{x:Typ…

Mac 修改默认jdk版本

当前会话生效 这里演示将 Java 17 版本降低到 Java 8 查看已安装的 Java 版本&#xff1a; 在终端&#xff08;Terminal&#xff09;中运行以下命令&#xff0c;查看已安装的 Java 版本列表 /usr/libexec/java_home -V设置默认 Java 版本&#xff1a; 找到 Java 8 的安装路…

K8S + Jenkins 做CICD

前言 这里会做整体CICD的思路和流程的介绍&#xff0c;会给出核心的Jenkins pipeline脚本&#xff0c;最后会演示一下 实验/实操 结果 由于整体内容较多&#xff0c;所以不打算在这里做每一步的详细演示 - 本文仅作自己的实操记录和日后回顾用 要看保姆式教学的可以划走了&…

使用 前端技术 创建 QR 码生成器 API1

前言 QR码&#xff08;Quick Response Code&#xff09;是一种二维码&#xff0c;于1994年开发。它能快速存储和识别数据&#xff0c;包含黑白方块图案&#xff0c;常用于扫描获取信息。QR码具有高容错性和快速读取的优点&#xff0c;广泛应用于广告、支付、物流等领域。通过扫…

基于Java Springboot高校工作室管理系统

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 数据…

【读书】复杂性意义结构框架——Cynefin框架

Cynefin框架 《代码大全》的作者史蒂夫麦克康奈尔&#xff08;Steve McConnell&#xff09;在《卓有成效的敏捷》这本书里&#xff0c;探讨了用于理解不确定性和复杂性的Cynefin框架。 Cynefin框架是戴维斯诺登&#xff08;David Snowden&#xff09;20世纪90年代的在IBM时创…

ZYNQ-7020嵌入式系统学习笔记(1)——使用ARM核配置UART发送Helloworld

本工程实现调用ZYNQ-7000的内部ARM处理器&#xff0c;通过UART给电脑发送字符串。 硬件&#xff1a;正点原子领航者-7020 开发平台&#xff1a;Vivado 2018、 SDK 1 Vivado部分操作 1.1 新建工程 设置工程名&#xff0c;选择芯片型号。 1.2 添加和配置PS IP 点击IP INTEGR…

全面击破工程级复杂缓存难题

目录 一、走进业务中的缓存 &#xff08;一&#xff09;本地缓存 &#xff08;二&#xff09;分布式缓存 二、缓存更新模式分析 &#xff08;一&#xff09;Cache Aside Pattern&#xff08;旁路缓存模式&#xff09; 读操作流程 写操作流程 流程问题思考 问题1&#…

SpringSecurity创建一个简单的自定义表单的认证应用

1、SpringSecurity 自定义表单 在 Spring Security 中创建自定义表单认证应用是一个常见的需求&#xff0c;特别是在需要自定义登录页面、认证逻辑或添加额外的表单字段时。以下是一个详细的步骤指南&#xff0c;帮助你创建一个自定义表单认证应用。 2、基于 SpringSecurity 的…

用python简单集成一个分词工具

本部分记录如何利用Python进行分词工具集成&#xff0c;集成工具可以实现运行无环境要求&#xff0c;同时也更方便。 该文章主要是记录&#xff0c;知识点不是特别多&#xff0c;欢迎访问个人博客&#xff1a;https://blog.jiumoz.top/archives/fen-ci-gong-ju-ji-cheng 成品展…

Fakelocation Server服务器/专业版 Windows11

前言:需要Windows11系统 Fakelocation开源文件系统需求 Windows11 | Fakelocation | 任务一 打开 PowerShell&#xff08;以管理员身份&#xff09;命令安装 Chocolatey Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProto…

【云计算】腾讯云架构高级工程师认证TCP--考纲例题,知识点总结

【云计算】腾讯云架构高级工程师认证TCCP–知识点总结&#xff0c;排版整理 文章目录 1、云计算架构概论1.1 五大版块知识点&#xff08;架构设计&#xff0c;基础服务&#xff0c;高阶技术&#xff0c;安全&#xff0c;上云&#xff09;1.2 课程详细目录1.3 云基础架构设计1.4…

HarmonyOs鸿蒙开发实战(22)=>开源插件集成-城市选择案例(带字母索引可修改源码)

1.第一步>DevEco Studio集成开源插件 1.1.下载资源插件 1.2.打开Perferences页面&#xff0c;从本地导入安装插件 2.第二步>导入HarmonyOs Next组件市场的城市选择案例&#xff0c;安装 2.1. 代码空白处右键&#xff0c;打开开源组件弹窗 2.2. 安装城市选择案例 3.第三步…

ROS之什么是Node节点和Package包?

1.什么是ROS&#xff1f; 官方术语&#xff1a;ROS&#xff08;Robot Operating System&#xff0c;机器人操作系统&#xff09;是一个开源的、模块化的机器人软件框架。它为机器人开发提供了一套工具和库&#xff0c;用于实现硬件抽象、设备驱动、消息传递、多线程管理等功能…

Windows环境安装MongoDB

文章目录 1. 下载MongoDB2. 安装MongoDB3. Compass-图形化界面客户端4. 更换Compass的主题 阅读本文前可以先阅读以下文章&#xff1a; MongoDB快速入门&#xff08;MongoDB简介、MongoDB的应用场景、MongoDB中的基本概念、MongoDB的数据类型、MongoDB的安装与部署、MongoDB的常…

在线解析工具链接

在线字数统计工具-统计字符字节汉字数字标点符号-计算word文章字数字数统计,字符统计,字节统计,字数计算,统计字数,统计字节数,统计字符数,统计word字数,在线字数统计,在线查字数,计算字数,字数统计工具,支持手机移动端查询多少字数,英文:Calculate the number of words,Count …

RTL8211F 1000M以太网PHY指示灯

在RK3562 Linux5.10 SDK里面已支持该芯片kernel-5.10/drivers/net/phy/realtek.c&#xff0c;而默认是没有去修改到LED配置的&#xff0c;我们根据硬件设计修改相应的寄存器配置&#xff0c;该PHY有3个LED引脚&#xff0c;我们LED0不使用&#xff0c;LED1接绿灯&#xff08;数据…

通关C语言自定义类型:联合和枚举

C语言的自定义类型有四个分别是&#xff1a;数组&#xff1b;结构体&#xff08;struct&#xff09;&#xff1b;联合体&#xff08;union&#xff09;&#xff1b;枚举&#xff08;enum&#xff09;。前面已经讨论过数组和结构体&#xff0c;这期让我们来学习一下联合体和枚举…