optional

参考资料:

Java8 Optional用法和最佳实践 - 掘金

一、背景

根据Oracle文档,Optional是一个容器对象,可以包含也可以不包含非null值。Optional在Java 8中引入,目的是解决  NullPointerExceptions的问题。本质上,Optional是一个包装器类,其中包含对其他对象的引用。在这种情况下,对象只是指向内存位置的指针,并且也可以指向任何内容。从其它角度看,Optional提供一种类型级解决方案来表示可选值而不是空引用。

Optional之前

在Java 8之前,程序员将返回null而不是Optional。这种方法有一些缺点。一种是没有明确的方法来表示null可能是一个特殊值。相比之下,在API中返回Optional是明确的声明,其中可能没有值。如果我们要确保不会出现空指针异常,则需要对每个引用进行显式的空检查,如下所示,我们都同意这是很多样板。

// Life before Optional
    private void getIsoCode( User user){
        if (user != null) {
            Address address = user.getAddress();
            if (address != null) {
                Country country = address.getCountry();
                if (country != null) {
                    String isocode = country.getIsocode();
                    if (isocode != null) {
                        isocode = isocode.toUpperCase();
                    }
                }
            }
        }
    }

为了避免上述繁杂 的  !=null  ,我们可以引入Optional

二、Optional类的对象创建

均为静态方法创建

1. Optional.empty()

 //第一种创建方式
        Optional<String> optional=Optional.empty();
        //判断是否为空. 此时为 空null,
        System.out.println(optional.isEmpty());
        //判断是否存在。此时不存在,返回false
        System.out.println(optional.isPresent());
        //如果optional为null,则会出现异常.  
        System.out.println(optional.get());

2.Optional.of()

//第二种创建方式
        //Optional<String> optional=Optional.of(null); //value 不能为null,不然会报错
        Optional<String> optional1=Optional.of("123");
        System.out.println(optional1.get());

3. Optional.ofNullable()

三、检查Optional的value是否存在

下面代码中包含了3种判断方法

   Optional<String> optional=Optional.ofNullable(null);
        //1.
        boolean empty = optional.isEmpty();
        //2.
        boolean present = optional.isPresent();
        //3.
        optional.ifPresent(new Consumer<String>() {
            @Override
            public void accept(String s) {
                System.out.println("一旦存在,就调用我这个方法");
            }
        });

这个filter方法,有点意思,可以自己去判断是否满足一个条件,满足则创建一个新的Optional对象并且value跟所要判断的optional的value一致。否则返回一个Optional.empty()

四、获取value的方法

让gpt解释一下  orElse() 与orElseGet()的区别

五、Optional的最佳实践

当你在编写项目时使用 Optional 类型时,以下是一些最佳实践建议:

  1. 不要将 Optional 用于方法参数或字段类型

    • Optional 类型主要用于表示可能存在空值的返回值类型。
    • 如果将其用于方法参数或字段类型,则可能会使代码变得复杂,甚至不必要。
  2. 尽量避免使用 Optional 的 get() 方法

    • Optional 的 get() 方法可以用于获取 Optional 对象中的值,但如果 Optional 对象为空,则会抛出 NoSuchElementException 异常。
    • 因此,为了避免异常的发生,最好使用其他方法来处理 Optional 对象的值,比如 orElse() 或 orElseGet()。
  3. 使用 Optional 来处理返回值为空的情况

    • 如果一个方法可能返回 null,应该考虑使用 Optional 类型来代替。
    • 这样可以更明确地表示空值的含义,并提供更加优雅的语法来处理空值的情况。
  4. 使用 Optional 与 Stream API 结合使用

    • Optional 和 Stream API 是 Java 8 中引入的两个重要特性。
    • 它们结合使用可以提高代码的可读性和简洁性。
    • 可以使用 Optional 的 filter() 和 map() 方法来对 Stream 进行过滤和转换操作,从而生成新的 Optional 对象。

// 示例 1:使用 Optional 来处理返回值为空的情况
public Optional<String> getOptionalValue(String key) {
    String value = getValueByKey(key);
    return Optional.ofNullable(value);
}

// 示例 2:使用 Optional 和 Stream API 进行过滤操作
public Optional<User> findUserByName(String name) {
    List<User> userList = getUserList();
    return userList.stream()
            .filter(user -> user.getName().equals(name))
            .findFirst();
}

// 示例 3:使用 orElse() 方法提供默认值
Optional<String> optional = Optional.empty();
String result = optional.orElse("default value");

// 示例 4:使用 orElseGet() 方法提供默认值
Optional<String> optional = Optional.empty();
String result = optional.orElseGet(() -> generateDefaultValue());

// 示例 5:使用 map() 方法将 Optional 对象中的值转换为其他类型
Optional<String> optional = Optional.of("hello");
Optional<Integer> lengthOptional = optional.map(String::length);

// 示例 6:使用 flatMap() 方法展开 Optional 对象
Optional<Optional<String>> optional = Optional.of(Optional.of("hello"));
Optional<String> flattenedOptional = optional.flatMap(Function.identity());

关于示例6的一些解释:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C语言】内联函数

一、内联函数 在C语言中&#xff0c;内联函数&#xff08;Inline function&#xff09;是一种代码优化技术&#xff0c;它的目的是减少函数调用的开销。内联函数通知编译器在每个函数调用的位置插入函数的实际代码&#xff0c;而不是进行传统的函数调用。这避免了调用函数时的…

什么是特征图?

在卷积神经网络&#xff08;CNN&#xff09;中&#xff0c;特征图是在传递给卷积层的图像上发生卷积操作后卷积层的输出。 特征图是如何形成的&#xff1f; 在上面的插图中&#xff0c;我们可以看到特征图是如何从提供的输入图像中形成的。 要发送到卷积层的图像是一个包含像…

讲解把一个文件夹里面的内容复制到另一个文件夹中的操作

&#x1f38a;专栏【Java小练习】 &#x1f354;喜欢的诗句&#xff1a;天行健&#xff0c;君子以自强不息。 &#x1f386;音乐分享【如愿】 &#x1f384;欢迎并且感谢大家指出小吉的问题&#x1f970; 文章目录 &#x1f354;需求⭐思路✨代码✨效果 &#x1f384;如果要复制…

CCF 202104-2:邻域均值--C++

#include<iostream> #include<bits/stdc.h>using namespace std;int A[601][601]; int n;//长宽都为n个像素double FindNeighborSum(int i,int j,int r,int A[][601]) {int sum0;//像素和 int gs0;//领域 中的像素个数 for(int xi-r;x<ir;x)//找到每一个领域像素…

springboot3 liquibase SQL执行失败自动回滚,及自动打tag

一&#xff1a; 自动执行回滚&#xff0c; 已执行成功的忽略&#xff0c;新sql执行失败则执行新sql文件中的回滚sql pom.xml <dependency> <groupId>org.liquibase</groupId> <artifactId>liquibase-core</artifactId> <version>4.25.0&…

免费的数据采集软件,最新免费的几款数据采集软件【2024】

在当今数字化时代&#xff0c;数据是企业决策和业务发展的关键。而如何高效获取数据成为许多企业和研究机构的关注焦点。本文将深入探讨数据采集软件的种类。帮助大家选择最适合自己需求的数据采集工具。 数据采集软件种类 在众多数据采集软件中&#xff0c;有一类强大而多样…

工作实践中如何使用ThreadLocal?

主要作用 多线程问题主要是多个线程共享一个对象导致的&#xff0c;我们不让他共享就行了&#xff0c;每个线程保存一份自己的对象&#xff0c;自己玩自己的对象&#xff0c;就不会出现线程问题了。 ThreadLocal这个作用就是让线程自己独立保存一份自己的变量副本。每个线程都…

计算和传输背后的时空观

吞吐和速度(率)经常被混淆&#xff0c;当提到 100Gbps 网卡时&#xff0c;“它很快” 的意义可能只是 “它很多” 100Gbps 指 1s 内发送的比特数为 100G&#xff0c;如果在这 1s 内塞入更多比特&#xff0c;以下是两种方式&#xff1a; 显然&#xff0c;上面是更多&#xff…

TypeScript入门实战笔记 -- 开篇 为什么要选择 TypeScript ?

typescript 在线编辑器http://typescript.p2hp.com/play?#code/JYOwLgpgTgZghgYwgAgJIFUDO1Uhge2QG8AoZc5YAEwC5kQBXAWwCNoBuMikOJiOzGCigA5pwrI4ANzhg4UAPwChozgF8SmmAxAIwwfCGRYcefAAoADlHyXMdDNii4CASmJdyCQ5nwAbCAA6P3wRKxs7ABpkAHJrW0wY1xINEhNnM3MiSlpkAEZonj46GIBrROQ1…

Python:核心知识点整理大全11-笔记

目录 ​编辑 6.2.4 修改字典中的值 6.2.5 删除键—值对 注意 删除的键—值对永远消失了。 6.2.6 由类似对象组成的字典 6.3 遍历字典 6.3.1 遍历所有的键—值对 6.3.2 遍历字典中的所有键 往期快速传送门&#x1f446;&#xff08;在文章最后&#xff09;&#xff1a; 6.…

排序:归并排序

目录 归并排序——有递归的&#xff1a; 基本思想&#xff1a; 思路分析&#xff1a; 代码分析&#xff1a; 划分区间思路&#xff1a; 代码思路分析&#xff1a; 归并排序——有递归的&#xff1a; 基本思想&#xff1a; 归并排序&#xff08;MERGE-SORT&#xff…

《Kafka权威指南》读书笔记

《Kafka权威指南》第一、三、四、六章&#xff0c;是重点。可以多看看。 一、 Kafka的组成 kafka是一个发布与订阅消息系统消息&#xff1a;kafka的数据单元称为"消息"。可以把消息看成是数据库中的一个"数据行"。 消息的key&#xff1a;为key生成一个一…

鸿蒙开发组件之Image

Image组件加载图片方式有三种&#xff1a; 1、网络地址加载 直接Image(xxxx),添加上图片的网络地址就可以了。注意&#xff1a;真机、模拟题调试需要申请"ohos.permission.INTERNET"权限 Image(https://xxxxxxx) 2、PixelMap格式加载像素图 Image(PixelMapObjec…

【小沐学Python】Python实现语音识别(vosk)

文章目录 1、简介1.1 vosk简介1.2 vosk模型1.3 vosk服务 2、安装3、测试3.1 命令行测试3.2 代码测试 结语 1、简介 https://alphacephei.com/vosk/index.zh.html Vosk 是一个语音识别工具包。 1.1 vosk简介 支持二十种语言 - 中文&#xff0c;英语&#xff0c;印度英语&#…

Mac虚拟机CrossOver23破解版下载和许可证下载

CrossOver Mac Mac 和 Windows 系统之间的兼容工具。使 Mac 操作系统的用户可以运行 Windows 系统的应用&#xff0c;从办公软件、实用工具、游戏到设计软件&#xff0c; 您都可以在 Mac 程序和 Windows 程序之间随意切换。 系统要求 运行macOS的基于Intel或Apple Silicon 的…

【原创】【一类问题的通法】【真题+李6卷6+李4卷4(+李6卷5)分析】合同矩阵A B有PTAP=B,求可逆阵P的策略

【铺垫】二次型做的变换与相应二次型矩阵的对应&#xff1a;二次型f&#xff08;x1&#xff0c;x2&#xff0c;x3&#xff09;xTAx&#xff0c;g&#xff08;y1&#xff0c;y2&#xff0c;y3&#xff09;yTBy ①若f在可逆变换xPy下化为g&#xff0c;即P为可逆阵&#xff0c;有P…

【SpringBoot篇】5种类型参数传递json数据传参的操作

&#x1f38a;专栏【SpringBoot】 &#x1f354;喜欢的诗句&#xff1a;天行健&#xff0c;君子以自强不息。 &#x1f386;音乐分享【如愿】 &#x1f384;欢迎并且感谢大家指出小吉的问题&#x1f970; 文章目录 &#x1f33a;普通参数&#x1f33a;POJO参数&#x1f33a;嵌套…

Java面试遇到的一些常见题

目录 1. Java语言有几种基本类型&#xff0c;分别是什么&#xff1f; 整数类型&#xff08;Integer Types&#xff09;&#xff1a; 浮点类型&#xff08;Floating-Point Types&#xff09;&#xff1a; 字符类型&#xff08;Character Type&#xff09;&#xff1a; 布尔类…

Unity中Batching优化的GPU实例化(4)

文章目录 前言一、构建需要实例化的额外数据二、在顶点着色器&#xff0c;将实例化 ID 从 appdata 存入 v2f 传给片元着色器三、在片断着色器中访问具体的实例化变量三、使用代码修改Shader材质属性&#xff0c;实现GPU实例化后不同对象颜色不同的效果1、在C#测试脚本生成小板凳…

Redis 环境搭建2

文章目录 第2关&#xff1a;使用 Redis 第2关&#xff1a;使用 Redis 本文是接着上篇文章写的第二关代码&#xff0c;部分人再进入第二关时不会保留第一关的配置的环境&#xff0c;可以通过下面一句代码进行检验。 redis-cli -p 7001 -c如果进入到了redis界面就是有环境&…