Optional——优雅判空

news2024/11/25 15:55:43

初始化

Optional提供了三个初始化方法:

@SpringBootTest
public class OptionalTest {

    @Test
    public void testOptional() {
	    Optional.empty();
        Optional.ofNullable(null);
        Optional.of(null);
    }
}

empty返回一个空的Optional对象。
of遇到空会报错,但是使用Optional的目的就是防止空指针,所以一般使用ofNullable较多。
在这里插入图片描述

ifPresent

ifPresent——如果存在则xxx

public void testOptional() {
        Student student = new Student();
        student.setName("feng");
        student.setAge(18);
        Optional.of(student);

        // 普通做法
        if(student !=  null){
            System.out.println(student.getName());
        }
        
        // Optional普通用法
        Optional<Student> optional = Optional.ofNullable(student);
        if(optional.isPresent()){
            Student student1 = optional.get();
            System.out.println(student1.getName());
        }

        // 正确用法
        optional.map(new Function<Student, String>() {
            @Override
            public String apply(Student student) {
                return student.getName();
            }
        }).ifPresent(System.out::println);

		// 简化
		optional.map(Student::getName).ifPresent(System.out::println);
    }

orElse和orElseGet

如果没有对象,则调用一个创建对象的方法。
orElse类似于饿汉式,如果当前对象不为空就使用当前的对象,如果为空则调用方法去创建一个新对象。
orElseGet类似于懒汉式,只有当前对象为空才会去调用,通常使用orElseGet较多。

当前对象不为空:

    public void testOptional() {
        Student student = new Student();
        student.setName("feng");
        student.setAge(18);
        Optional<Student> optional = Optional.ofNullable(student);
        Student student1 = optional.orElse(createStudent());
        // orElseGet接收一个Suppilier,一个匿名内部类,调用get方法处理逻辑
        Student student2 = optional.orElseGet(new Supplier<Student>() {
            @Override
            public Student get() {
                return createStudent();
            }
        });
    }

    private Student createStudent(){
        System.out.println("create student");
        return new Student();
    }

在这里插入图片描述

当前对象为空:

    public void testOptional() {
        Student student = null;
        Optional<Student> optional = Optional.ofNullable(student);
        Student student1 = optional.orElse(createStudent());
        // orElseGet接收一个Suppilier,一个匿名内部类,调用get方法处理逻辑
        Student student2 = optional.orElseGet(new Supplier<Student>() {
            @Override
            public Student get() {
                return createStudent();
            }
        });
    }

    private Student createStudent(){
        System.out.println("create student");
        return new Student();
    }

在这里插入图片描述

过滤

	public void testOptional() {
        Student student = new Student();
        student.setName("feng");
        student.setAge(18);
        Optional<Student> optional = Optional.ofNullable(student);
        optional.filter(student1 -> student1.getAge() > 1).ifPresent(student1 -> System.out.println(student1.getAge()));
    }

map和flatMap

Optional是Java中用于处理可能包含或不包含值的容器类。Optional提供了一些方法来对这些值进行操作,其中包括mapflatMap

  1. Optional.map
    • map方法用于在Optional包含值的情况下,对其进行转换或操作。
    • 如果Optional包含一个值,map会将这个值传递给提供的函数,并返回一个包含转换结果的新Optional
    • 如果Optional为空,map不执行任何操作,直接返回一个空Optional
    • map的签名如下:<U> Optional<U> map(Function<? super T, ? extends U> mapper)
Optional<String> optional = Optional.of("Hello");
Optional<Integer> lengthOptional = optional.map(s -> s.length());

在上面的例子中,optional包含一个字符串值"Hello",map方法将字符串长度计算并返回一个新的Optional包含计算结果,即一个整数。

  1. Optional.flatMap
    • flatMap方法用于在Optional包含值的情况下,进行一种扁平映射,它期望传入的函数返回另一个Optional
    • 如果Optional包含一个值,flatMap会将这个值传递给提供的函数,该函数返回一个Optional,然后flatMap返回这个新的Optional
    • 如果Optional为空,flatMap不执行任何操作,直接返回一个空Optional
    • flatMap的签名如下:<U> Optional<U> flatMap(Function<? super T, Optional<U>> mapper)
Optional<String> optional = Optional.of("Hello");
Optional<Integer> lengthOptional = optional.flatMap(s -> Optional.of(s.length()));

在上面的例子中,optional包含一个字符串值"Hello",flatMap方法将字符串长度计算并返回一个新的Optional包含计算结果,即一个整数。注意,flatMap函数返回的是Optional<Integer>,而不是Optional<Optional<Integer>>,这是因为flatMap会自动将嵌套的Optional展平为单层。

总结:

  • map用于对包含的值进行转换,并返回新的Optional
  • flatMap用于对包含的值进行扁平映射,并返回一个新的Optional,通常用于解决嵌套Optional的问题。

整体使用

// 普通
public void before8(List<Student> Students) {
    for (Student student:Students) {
        if (student != null){
            if (student.getAge() > 18){
                Integer score = student.getScore();
                if (score != null && score > 80){
                    System.out.println(student.getName());
                }
            }
        }
    }
}



//1 
public void after8(List<Student> students) {
   students.stream()
           .filter(Objects::nonNull) // 过滤掉空的学生对象
           .filter(student -> student.getAge() > 18) // 按年龄过滤
           .map(Student::getScore) // 映射为分数
           .filter(score -> score != null && score > 80) // 按分数过滤
           .map(Student::getName) // 映射为姓名
           .ifPresent(System.out::println); // 如果存在姓名则打印
}

	public void after8(List<Student> Students) {
        for (Student student:Students) {
            Optional<Student> studentOptional = Optional.of(student);
			
// 2
         Integer sorce = studentOptional
                 .filter(s -> s.getAge() > 18)
                 .map(Student::getScore)
                 .orElse(0);//.orElse(0)返回一个默认值,防止控空指针  
         if (sorce > 80){
             System.out.println(student.getName());
         }


// 3
         String name = studentOptional
                 .filter(s -> s.getAge() >= 18)
                 .filter(s -> s.getScore() > 80)
                 .map(Student::getName)
                 .orElse("wu");//.orElse(0)返回一个默认值,防止控空指针
         System.out.println(name);
     }
    }

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

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

相关文章

Python | 安装、环境配置及包的安装

Python | 安装、环境配置及包的安装 一、前言二、python安装及编辑器配置2.1 python安装2.2 python调试2.3 python编辑器 | PyCharm2.3.1 PyCharm下载2.3.2 PyCharm安装2.3.3 PyCharm启动界面2.3.4 PyCharm初步设置2.3.5 PyCharm环境配置(含Python Interpreter配置)2.3.5.1 New…

2003-2022年飞机航线信息数据

2003-2022年飞机航线信息数据 时间&#xff1a;2003-2022年指标&#xff1a;起点城市、起点城市所属地级市、起点城市所属省份、起点机场、终点城市、终点城市所属地级市、终点城市所属省份、终点机场、航空公司、航班、机型、出发时间、到达时间、准点率、班次_周一、班次_周…

pip安装apex报错ERROR: Could not build wheels for cryptacular.......

问题&#xff1a;在训练模型的时候需要安装apex包&#xff0c;遂即使用以下命令 pip install apex但是报错了&#xff0c;报错信息如下&#xff1a; WARNING: Building wheel for cryptacular failed: [Errno 2] No such file or directory: C:\\Users\\XXX\\AppData\\Local\…

Corel VideoStudio 会声会影2024剪辑中间的视频怎么删 剪辑中音乐太长怎么办

我很喜欢视频剪辑软件Corel VideoStudio 会声会影2024&#xff0c;因为它使用起来很有趣。它很容易使用&#xff0c;但仍然给你很多功能和力量。视频剪辑软件Corel VideoStudio 会声会影2023让我与世界分享我的想法&#xff01;“这个产品的功能非常多&#xff0c;我几乎没有触…

解决找不到msvcp120.dll,无法继续执行代码的办法,msvcp120.dll丢失的解决办法

在使用电脑的过程中出现了“找不到msvcp120.dll,无法继续执行代码”&#xff0c;通常出现这种错误的原因是因为电脑中的msvcp120.dll文件丢失&#xff0c;但是文件丢失就会导致电脑出现软件不能打开的情况&#xff0c;也可能会导致电脑出现其他的问题&#xff0c;所以今天就给大…

【学习草稿】

【数据分析】 1、相关性分析 对变量之间相关关系的分析&#xff0c;即相关性分析。其中比较常用的是线性相关分析&#xff0c;用来衡量它的指标是线性相关系数&#xff0c;又叫皮尔逊相关系数&#xff0c;通常用r表示&#xff0c;取值范围是[-1,1]。 r的绝对值<0.3 ,低度线性…

spring报错 @EnableAsync annotation metadata was not injected

报错 报错 internalAsyncAnnotationProcessor 这个spring内部的后处理器 创建失败&#xff0c;进而导致 EnableAsync 注解元数据没有注入容器 分析问题 查了 博客 是配置类放到原始项目路径下导致的问题。 博主的路径虽然正确&#xff0c;但发现是相似的问题&#xff0c;最…

linux 驱动——将模块编译进内核

文章目录 新增 C 文件修改 Makefile 文件修改 Kconfig 文件模块使能内核启动日志参考 linux 驱动——字符设备驱动 linux 驱动——字符设备驱动(自动生成设备节点文件) linux 驱动——将模块编译进内核 前面两节介绍的驱动都是以模块的形式&#xff0c;需要手动加载&#xff0…

【kubernetes】pod的生命周期

文章目录 1、概述2、pod的生命期3、pod阶段4、容器状态5、容器重启策略6、pod状况6.1 Pod就绪态6.2 Pod就绪态的状态6.3 Pod网络就绪 7、容器探针7.1 检查机制7.2 探测结果7.3 探测类型 8、Pod的终止8.1 强制终止Pod8.2 Pod的垃圾收集 1、概述 pod遵循预定义的生命周期&#x…

matlab中的mapminmax函数初步理解和应用

matlab中的mapminmax函数初步认识 一、mapminmax 顾名思义&#xff1a;映射最大最小 二、语法及举例 2.1 语法1 [Y,PS] mapminmax(X) 将矩阵X映射形成矩阵Y, Y中每行中的最小值对应-1&#xff0c;最大值对应1。PS是一个包含映射信息的结构体。 举例&#xff1a; clc cle…

4.第一个Java程序的讲解—Hello World

本文将写一个程序输出 Hello World &#xff0c;然后逐句讲解 ~ 文章目录 一、输出 Hello World二、代码讲解2.1 package com.goole.demo;2.1.1 .idea、out、src2.1.2 解释 2.2 public class Main2.2.1 解释2.2.2 创建新类 2.3 public static void main(String[] args)2.3.1 解…

测试用例的设计方法(全):判定表驱动分析方法

目录 判定表驱动分析方法 一. 方法简介 二. 实战演习 判定表驱动分析方法 一. 方法简介 1.定义&#xff1a;判定表是分析和表达多逻辑条件下执行不同操作的情况的工具。 2.判定表的优点 能够将复杂的问题按照各种可能的情况全部列举出来&#xff0c;简明并避免遗漏。因此…

找不到d3dx9_43.dll如何修复?d3dx9_43.dll丢失的解决办法分享

在电脑使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“找不到d3dx9_43.dll”。这个错误通常出现在运行某些游戏或应用程序时&#xff0c;它会导致程序无法正常运行。那么&#xff0c;如何解决找不到d3dx9_43.dll的问题呢&#xff1f;下面我将分享…

贰[2],QT异常处理

1&#xff0c;异常&#xff1a;QT编译警告 warning LNK4042: 对象被多次指定&#xff1b;已忽略多余的指定 处理办法&#xff0c;检查.pri文件&#xff0c;是否关联了多个相同的文件(头文件.h/源文件.cpp) 2&#xff0c;异常&#xff1a;C4819: 该文件包含不能在当前代码页(936…

FreeRTOS_任务通知

目录 1. 任务通知简介 2. 发送任务通知 2.1 函数 xTaskNotify() 2.2 函数 xTaskNotifyFromISR() 2.3 函数 xTaskNotifyGive() 2.4 函数 vTaskNotifyGiveFromISR() 2.5 函数 xTaskNotifyAndQuery() 2.6 函数 xTaskNotifyAndQueryFromISR() 3. 任务通知通用发送函数 3.…

85.x的平方根(力扣)

目录 问题描述 代码解决以及思想 知识点 问题描述 代码解决以及思想 class Solution { public:int mySqrt(int x) {int left 0; // 定义左边界int right x; // 定义右边界&#xff0c;初始值取 xwhile (left < right) { // 当左边界小于或等于…

CC1101 一款低功耗sub- 1ghz收发器芯片 适用于无线遥控智能家居

产品描述 CC1101是一个低成本的sub- 1ghz收发器,专为极低功耗的无线应用而设计。 该电路主要用于工业、科学和医学)和SRD (Short Range Device)频带,在315,433,868和915兆赫&#xff0c;但可以轻松可编程用于其他操作频率在300-348 MHz、387-464 MHz,以及779-928 MHz频段。射…

【网络管理——操作系统与安全】

文章目录 一、安装WindowsServer操作系统1、新建虚拟机2、进入Windows虚拟机进行相关配置 二、Windows用户账户管理与配置1、创建用户账户2、创建用户组 三、Windows操作系统的本地安全策略设置1、配置用户账户密码策略2、配置用户账户锁定策略3、配置组策略安全选项4、配置审核…

CSDN每日一题学习训练——Java版(两数相加、二叉树的锯齿形层序遍历、解数独)

版本说明 当前版本号[20231106]。 版本修改说明20231106初版 目录 文章目录 版本说明目录两数相加题目解题思路代码思路补充说明参考代码 二叉树的锯齿形层序遍历题目解题思路代码思路参考代码 解数独题目解题思路代码思路补充说明参考代码 两数相加 题目 给你两个 非空 的…

代码随想录算法训练营第四十四天丨 动态规划part07

70. 爬楼梯 思路 这次讲到了背包问题 这道题目 我们在动态规划&#xff1a;爬楼梯 (opens new window)中已经讲过一次了&#xff0c;原题其实是一道简单动规的题目。 既然这么简单为什么还要讲呢&#xff0c;其实本题稍加改动就是一道面试好题。 改为&#xff1a;一步一个…