Java8新特性-防止空指针Optional<T> 类
程序员文章站
2022-03-04 11:28:32
...
Optional<T>
类(java.util.Optional)是一个容器类,代表一个值存在或不存在,原来用null
表示一个值不存在, 现在 Optional 可以更好的表达这个概念,并且可以避免空指针异常
常用方法:
-
Optional.of(T t) 创建一个Optional 实例 - t不允许为null
-
Optional.empty() 创建一个空的Optional 实例
-
Optional.ofNullable(T t) 若t不为null,创建Optional 实例,否则创建空实例-Optional.empty。
-
isPresent() : 判断是否包含空值
-
orElse(T t) : 如果调用对象包含值,返回该值,否则返回t
-
orElseGet(Supplier s) :如果调用对象包含值,返回该值,否则返回s获取的值
-
map(Function f ) ; 如果有值对其处理,并返回处理后的Optional,否则返回Optional.empty()
-
flatMap(Function mapper) : 与map 类似,要求返回值必须是Optional
现有两个类: Man , Godness
package com.java.pojo;
public class Man {
private Godness godness;
public Man() {
}
public Man(Godness godness) {
this.godness = godness;
}
public Godness getGodness() {
return godness;
}
public void setGodness(Godness godness) {
this.godness = godness;
}
@Override
public String toString() {
return "Man [godness=" + godness + "]";
}
}
package com.java.pojo;
public class Godness {
private String name;
public Godness() {
}
public Godness(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Godness [name=" + name + "]";
}
}
需求: // 需求 获取男人心中女神的名字
@Test
public void test5() {
// 需求 获取男人心中女神的名字
Man man = new Man();
String godnessName = getGodnessName(man);
System.out.println(godnessName);
}
// 不使用Optional的普通写法 现在只是两层 如果嵌套几十层,第一阅读性差,第二 性能低下
private String getGodnessName(Man man) {
if (man != null) {
if (man.getGodness() != null) {
return man.getGodness().getName();
}
}
return "色既是空";
}
现在进行改造。 Godness类不变。
NewMan:
package com.java.pojo;
import java.util.Optional;
public class NewMan {
// 有可能没有的值 ,就可以包装在Optional容器里
private Optional<Godness> godness = Optional.empty();
public Optional<Godness> getGodness() {
return godness;
}
public void setGodness(Optional<Godness> godness) {
this.godness = godness;
}
public NewMan() {
super();
}
public NewMan(Optional<Godness> godness) {
super();
this.godness = godness;
}
@Override
public String toString() {
return "NewMan [godness=" + godness + "]";
}
}
@Test
public void test6() {
// 需求 获取男人心中女神的名字
Optional<NewMan> optional = Optional.ofNullable(new NewMan());
String godnessName2 = getGodnessName2(optional);
System.out.println(godnessName2);
}
private String getGodnessName2(Optional<NewMan> man) {
return man.orElse(new NewMan()).getGodness().orElse(new Godness("色即是空")).getName();
}