Optional类
Optional类(java.util.Optional)是一个容器类,可以用来表示一个对象是否存在。
原来用null表示一个对象是否存在,现在Optional可以更好的表达这个概念,并且可以避免空指针异常。
常用方法
- static of(T t):创建一个Optional实例
- static empty():创建一个空的Optional实例
- static ofNullable(T t):若t不为null,创建Optional实例;否则创建空实例
- isPresent():调用的容器对象是否包含值
- orElse(T t):如果调用的容器对象包含值,返回该值;否则返回t
- orElseGet(Supplier s):如果调用容器对象包含值,返回该值;否则返回s获取的值
- map(Function f):如果有值对其处理,并返回f处理后的Optional;否则返回Optional.empty()
- flatMap(Function f):与map类似,但是f处理的返回值要求必须是Optional类型。可以进一步控制空指针异常
示例代码如下:
String s = "hello";
//1、创建1个包含指定s对象的容器,如果s为null,会报NullPointerException
Optional<String> op1 = Optional.of(s);
System.out.println(op1.get());
//2、创建一个空容器
Optional<String> op2 = Optional.empty();
//System.out.println(op2.get());//NoSuchElementException(容器中不存在任何对象)
//3、创建1个包含指定s对象的容器,如果s为null,会创建一个空容器
Optional<String> op3 = Optional.ofNullable(s);
System.out.println(op3);
//4、
s = null;
Optional<String> op4 = Optional.ofNullable(s);
if(op4.isPresent()){//判断容器中是否有值
System.out.println(op4.get());
}
//5、如果op4容器中有对象,返回该对象;如果没有对象,返回指定的"Java"对象
String s2 = op4.orElse("Java");
System.out.println(s2);
//6、如果op4容器中有对象,返回该对象;如果没有对象,返回指定操作获得的对象
String s3 = op4.orElseGet(() -> "JavaSE");
System.out.println(s3);
//7、如果op3容器中有对象,返回处理后的对象;若容器中没有对象,返回一个空容器
Optional<String> nop3 = op3.map(String::toUpperCase);
System.out.println(nop3.get());
//8、如果op4容器中有对象,返回处理后的对象;若容器中没有对象,返回一个空容器
Optional<String> nop4 = op4.flatMap(a -> Optional.of(a.toUpperCase()));
System.out.println(nop4.get());//返回一个空容器
应用演示:
现有2个实体类:
public class Man {
private Goddess goddess;//女神
//省略了构造方法、getters、setters和toString方法
}
public class Goddess {
private String name;
//省略了构造方法、getters、setters和toString方法
}
//测试类:获取男人心目中女神的名字
public void test(){
//1)
Man man = new Man();
//System.out.println(getGodnessName(man));//NullPointerException
//2)
System.out.println(getGoddessName2(man));
//3)
Optional<Goddess> goddess = Optional.ofNullable(new Goddess("凤姐"));
Optional<NewMan> op = Optional.ofNullable(new NewMan(goddess));
System.out.println(getGoddessName3(op));
}
//1)获取女神的名字
public String getGoddessName(Man man){
return man.getGoddess().getName();
}
//2)获取女神的名字(改进)
public String getGoddessName2(Man man){
if(man != null){
Goddess g = man.getGoddess();
if(g != null){
return g.getName();
}
}
return "苍老师";
}
//3)获取女神的名字(Optional改进)
//参数op可能没对象,这时候可以通过orElse方法在op容器内创建一个NewMan对象。
//而该NewMan对象的goddess属性可能为null,可以通过orElse进行设置
public String getGoddessName3(Optional<NewMan> op){
return op.orElse(new NewMan())
.getGoddess().orElse(new Goddess("苍老师"))
.getName();
}
//NewMan类
public class NewMan {
//NewMan对象可以没有Goddess,所有可以放入到Optional容器中,避免空指针异常
private Optional<Goddess> goddess = Optional.empty();
//省略了构造方法、getters、setters和toString方法
}