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()));
获取可选值
如果此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