日常学习收货——Optional 类

2024-03-16 02:10
文章标签 学习 日常 optional 收货

本文主要是介绍日常学习收货——Optional 类,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

今天学习同事的代码,好吧就是新员工为了尽快的跟上节奏。没事的我就看别人写的代码。发现了一个新的类 optional.

本着好奇的心理,瞧瞧这个类的作用。

这个类是专门针对空指针异常整出来的。有点意思。

介绍一下这个类的起源,吃水不忘挖井人

为了解决空指针异常的问题,Google公司著名的Guava项目引入了Optional类,Guava通过使用检查空值的方式来防止代码污染,它鼓励程序猿写更干净的代码。收到Google Guava项目的启发,Optional类已经成为Java 8类型库的一部分。

加到java类库之后,描述是这样的

A container object which may or may not container a non_null value.If a value is present, isPresent() will return true and get() will Return the value.

(这是一个可以为null的容器对象,如果值存在则isPresent()方法会返回true,调用get()方法会返回其值)

举个小例子吧;

String address = user.getCountry().getCity().getAddress().toString();

要获取用户的地址,存在级联关系的话 如果国家或者城市为空都会报空指针。

所以我们一般不会这么写,

if(user != null){

      Country country = user.getCountry();

      if(country != null){

            City city = country.getCity();

            if(city != null){

                  address = city.getAddress().toString();

            }

      }

}

这样的写法复杂,有繁琐。想简单的写吧,有存在空指针异常的问题。

我们可以来试试Optinal的写法

Optional<String> opt = Optional.ofNullable(user.getCountry().getCity().getAddress().toString());

If(opt.isPsent()){

      String address = opt.get();

}

(注意,接收类型需要和传入类型一致)

这样是不是就简单了很多了

在我简单的测试中发现new HashMap<String,Objet>(),也是一样属于有值的

这里我们发先c 的是肯定是不存在的,走了false的方法。如果我们在这里一定要去获取C的值呢? 又会是一个什么样的情况?

我调整了一下 b 与 c的位置  看来还是不能去强行获取的。如果我插入一个值为null 又是什么情况呢?

Null值在这里算不存在的? 石锤了  ,总之我们的目的是达到了,简写了很多代码,规避了空指针的情况。

接下来,我们看看Optional提供的API

第一个,orElse();

不多说上图

如果有值则返回该值,否则返回它的参数值。途中的map2是null所以返回的是map的值。至于为啥我会写一个map1 大家可以去试试

接下来看第二个 orElseGet()

没有值的时候,都执行后面的方法,那么在有值的时候呢?

orElse()方法依旧执行了createNewMap()的方法,但是orElseGet()却没有。所以他们两者之间还是有一定的区别的。

测试的demo写的很low 大佬们留情。

后面还有一些还测试的API 就不全部介绍了,一味的看demo是没有任何用的 需要自己去动手实验。

 

----------------------------------------------------------------------------------------------------------------------------------------------

最近在工作中还是发现了一些问题,补充一下,上面的漏洞

Optional<String> opt = Optional.ofNullable(user.getCountry().getCity().getAddress().toString());

如果user.getCountry() 这个的值就是一个空了,那么即使用了Optional。也一样用报错。

 

 

老规矩附录一下大佬们的文章地址:https://www.cnblogs.com/zhangboyu/p/7580262.html

https://blog.csdn.net/dylgs314118/article/details/101015690

这篇关于日常学习收货——Optional 类的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/813963

相关文章

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和

java中Optional的核心用法和最佳实践

《java中Optional的核心用法和最佳实践》Java8中Optional用于处理可能为null的值,减少空指针异常,:本文主要介绍java中Optional核心用法和最佳实践的相关资料,文中... 目录前言1. 创建 Optional 对象1.1 常规创建方式2. 访问 Optional 中的值2.1

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

重新对Java的类加载器的学习方式

《重新对Java的类加载器的学习方式》:本文主要介绍重新对Java的类加载器的学习方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、介绍1.1、简介1.2、符号引用和直接引用1、符号引用2、直接引用3、符号转直接的过程2、加载流程3、类加载的分类3.1、显示

Java学习手册之Filter和Listener使用方法

《Java学习手册之Filter和Listener使用方法》:本文主要介绍Java学习手册之Filter和Listener使用方法的相关资料,Filter是一种拦截器,可以在请求到达Servl... 目录一、Filter(过滤器)1. Filter 的工作原理2. Filter 的配置与使用二、Listen

Java Optional的使用技巧与最佳实践

《JavaOptional的使用技巧与最佳实践》在Java中,Optional是用于优雅处理null的容器类,其核心目标是显式提醒开发者处理空值场景,避免NullPointerExce... 目录一、Optional 的核心用途二、使用技巧与最佳实践三、常见误区与反模式四、替代方案与扩展五、总结在 Java

Java Optional避免空指针异常的实现

《JavaOptional避免空指针异常的实现》空指针异常一直是困扰开发者的常见问题之一,本文主要介绍了JavaOptional避免空指针异常的实现,帮助开发者编写更健壮、可读性更高的代码,减少因... 目录一、Optional 概述二、Optional 的创建三、Optional 的常用方法四、Optio

Pydantic中Optional 和Union类型的使用

《Pydantic中Optional和Union类型的使用》本文主要介绍了Pydantic中Optional和Union类型的使用,这两者在处理可选字段和多类型字段时尤为重要,文中通过示例代码介绍的... 目录简介Optional 类型Union 类型Optional 和 Union 的组合总结简介Pyd

Java进阶学习之如何开启远程调式

《Java进阶学习之如何开启远程调式》Java开发中的远程调试是一项至关重要的技能,特别是在处理生产环境的问题或者协作开发时,:本文主要介绍Java进阶学习之如何开启远程调式的相关资料,需要的朋友... 目录概述Java远程调试的开启与底层原理开启Java远程调试底层原理JVM参数总结&nbsMbKKXJx

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操