首页 > 其他分享 >Optional容器对象

Optional容器对象

时间:2024-06-14 22:24:32浏览次数:23  
标签:返回 容器 name 对象 optional null Optional String

Optional容器对象

介绍

Optional是一个容器对象,是java8引入新引进的类,可以用来解决 空指针异常

本质上这是一个包含可选值的包装类,所以Optional类可以含有对象也可以为空,Optional是Java实现函数式编程的强劲一步,并且帮助在范式中实现。但是本质尚Optional是一个包装器类,其中包含对其他对象的引用,在这种情况下,对象只是指向内存位置的指针,并且也可以指向任何内容,从其他角度来看,Optional提供了一种类型级解决方案来表示可选值而不是空引用。

在Java8之前,我们将返回null而不是Optional。这种方法我们要确保不会出现空指针异常,则需要对每个引用进行显式的空检查。

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();
                    }
                }
            }
        }

用法

Optional特性
Optional类提供了大约10种方法,我们可以使用他们来创建和使用Optional类

创建实例方法

以下为创建可选实例的三种创建方法。

创建一个Optional类
返回一个空的Optional实例

//Optional<T> [Optional]<T>[empty]()
Optional<String> empty = Optional.empty();

在返回一个空的{Optional}实例时,Optional的值不存在。不过如果对象为空,请避免与Optional.empty()返回的实例的{==}比较。因为不能保证他是一个单例,反之,应该使用isPresent().

返回特定的非空值Optional

String name = "java";
Optional<String> opt = Option.of(name)

静态方法需要一个非null参数,否则将引发空指针异常,因此如果我们不知道参数是否为null,那就使用ofNullable,下面将对此进行介绍。

返回描述指定值的Optional,如果非空,则返回空值

Optional<String> optional = Optional.ofNullable(name());
private String name(){
String name ="Java";
return (name.length()>5)?name:null;
}

如果我们传入一个空引用,他不会抛出异常,而是返回一个空的Optional对象;

检查值用法

布尔值[isPresent]

如果存在值则返回true值,反之,返回fasle;

如果所包含的对象不为null,则返回true,反之返回false。通常在对对象执行任何其他操作之前,先在Optional上调用此方法。

//ispresent
Optional<String> optional = Optional.of("javaone");
if(optional.isPresent()){
//TODO
}

布尔值[isEmpty()]

如果存在值,则返回flase;否则返回true,这与isPresent相反,并且尽在Java11以及更高版本种可用

//isempty
Optional<Stirng> optional = Optional.of("javaone");
if(optionall.isEmpty()){
//TODO
}

如果存在值,则使用该值调用指定的使用者,否则,社么都不做

如果你不熟悉Java8,那么您可能会想知道,什么是消费者,简单来说,消费者就是一种接收参数且不返回任何内容的方法。当使用ifPresent时,这个方法就是一石二鸟。

我们可用执行值存在性检查并使用一种方法执行预期的操作。

//ifpresent
Optional<Sring> optional = Optional.of("javaone")l
optionall.ifPresent(s->System.out.println(s.length()));

获取可选值

T[get]

如果此Optional中存在值,则返回该值,否则抛出NoSuchElementException.在这之后,我们想要的是存储在Optional中的值,我们可以通过get()来获取它,但是当该值为null时,此方法将引发异常,这就需要orElse()来紧急救援。

//get
Optional<String> optional = Optional.of("Javaone");
if(optional.isPresent()){
String value = optional.get();

orElse()

返回值;反之返回其他

该orElse()方法用于检索包装在Optional实例内的值。它采用一个充当默认值的参数,该orElse()方法返回包装的值以及参数,反之。

//orElse
String nullName = null;
String name = Optional.ofNullable(nullName).ofElse("default_name");

适用场景

Optional的方法是尝试通过构建更具表现力的API的可能性来减少Java系统中空指针异常的情况,这些API解释了有时缺少返回值的可能性。

但是 Optional并不是一种避免所以类型的空指针的机制,列如它仍然必须测试方法和构造

像使用null一样,Optional不能帮助传达缺失值的含义,以类似的方式,null可能意味着很多不同的东西

Optional的预期用途主要是作为返回类型,获取此类型的实例之后,可以提取该值或提供其他行为,Optional类的一个非常有用的用例是将其与流或者返回Optional值以构建流畅的API的其他方法结合。

User user = urers.stream().findFirst().orElse(new User("defalt","1234"));

标签:返回,容器,name,对象,optional,null,Optional,String
From: https://www.cnblogs.com/yifan0820/p/18248736

相关文章

  • 对象类型注解
    有两种方法一个是用type,一个是用interfacetype用法://type别名={//属性名:类型//属性名n:类型n//}//let变量名:别名={//属性名:值//属性名n:值n//}typeobjType={name:stringage:number}letobjs={name:'姓名’,age:20......
  • Java面向对象基本特征——抽象、接口、多态、内部类
    面向对象概述        面向对象思想是从现实世界客观存在的事物出发来构造软件系统。对象是现实生活中实际存在的事物;类是由相同类型的对象共有的特征和行为归纳构成的。    而面向对象的思想就是把现实世界中的对象所具有的特征和行为抽象出来形成一个类,再根......
  • Docker的通俗理解和通过宿主机端口访问Redis容器的实例
    前言本文解决的问题:入门docker理解镜像与容器、宿主机的概念理解Docker的常用指令创建redis容器,并通过宿主机端口访问默认读者的知识背景:使用过git初次使用Docker本文不会对Docker的定义作出解释,不会涉及Docker的实现原理,旨在帮助读者快速入门docker,理解......
  • php基础语法_面向对象
    PHPphp代码标记多种标记来区分php脚本ASP标记:<%php代码%>短标记:脚本标记:标准标记(常用):简写风格:ASP风格:<%php代码%>注意:简写风格和ASP风格需要在php.ini配置文件中修改以下配置为on,移植性差short_open_tag=onasp_tags=on<html><body> <b> <?php //脚......
  • 使用 Docker 卷来实现替换容器内文件为宿主机上的
    要将容器内的/usr/share/nginx/html目录替换成宿主机上的/path/html目录里的内容,你可以使用Docker卷来实现。以下是你需要做的修改:停止并删除现有的前端容器(如果它正在运行):docker-composedown--remove-orphans修改docker-compose.yml文件,在frontend服务中......
  • javascript - 面向对象
    要是直接百度,如何在javascript中创建一个对象,你能找到一堆这样的文章:《js创建对象的n种方式》、《闭包的n种写法》……咱们不参加考试,不要记那么多,整那么多写法,代码还不好维护。就例举几个,在实际项目开发过程中,比较好的代码写法。兼容语法1如果想兼容旧的浏览器,可以采......
  • 【C++修行之道】类和对象(六)再谈构造函数(初始化列表)| explicit关键字 | static成员 |
    目录一、再谈构造函数1.1构造函数体赋值1.2初始化列表1.所有的成员,既可以在初始化列表初始化,也可以在函数体内初始化2.每个成员变量在初始化列表中只能出现一次(初始化只能初始化一次)3.类中包含以下成员,必须放在初始化列表位置进行初始化:声明给缺省值也可以是其......
  • Docker镜像与容器的导入与导出
    参考chat-gpthttps://blog.csdn.net/qq_22211217/article/details/93936363https://blog.csdn.net/ncdx111/article/details/79878098https://www.runoob.com/docker/docker-import-command.htmlhttps://www.runoob.com/docker/docker-export-command.html环境环境版......
  • JAVA面向对象模型练习题3
    题目要求:        需求:在实际开发中,经常会遇到一些数组使用的工具类。请按照如下要求编写一个数组的工具类:ArraysUtils:        ①我们知道数组对象直接输出的时候是输出对象的地址的,而项目中很多地方都需要返回数组的内容,请在ArraysUtils中提供一个工具类......
  • 单细胞RNA测序(scRNA-seq) 理解Seurat对象存储信息含义和基本操作
    单细胞测序技术是在单个细胞水平上,对基因组、转录组和表观基因组水平进行分析测序技术。bulkRNA-seq获得的是组织或器官等大量细胞中表达信号的均值,无法获取细胞之间的差异信息(即丢失了细胞的异质性),而单细胞测序技术可以很好的弥补bulkRNA-seq这一不足,即获取混合样本中......