1.Optional的作用
它的设计目的是为了解决在代码中频繁出现的空指针异常问题。
在常规的代码当中,我们如果在一个A对象里面引用了B对象,当我们需要获取B对象的某一个值的操作的时候,要判断A对象里面是否为null,B对象是否为null,然后才能避免空指针的问题
2.Optional的常用api
1.Optional的创建
//创建一个空的optional对象
Optional.empty();
//创建一个 optional 对象,如果传递的值为 null,仍然会创建一个空的 Optional 对象
Optional.ofNullable("Hello");
//创建一个包含非空值的 Optional 对象,如果传递的值为 null,会抛出 NullPointerException
Optional.of(null);
2.常用的方法
isPresent(): 判断 Optional 对象是否包含非空值,对象有值返回true,否则为false
ifPresent(Consumer<? super T> consumer): 如果 Optional 对象包含非空值,则执行传入的操作
orElse(T other): 如果 Optional 对象包含非空值,则返回该值;否则返回传入的默认值
map() :转换值
filter() 接受一个 Predicate 参数,返回测试结果为 true 的值。如果测试结果为 false,会返回一个空的 Optional。
普通方法和optical的对比
package com.wu.test.optional;
import java.util.Optional;
public class Test {
public static void main(String[] args) {
A a=null;
//获取A对象里面的B对象的name属性
//常规写法
if (a!=null){
if (a.getB()!=null){
System.out.println(a.getB().getName());
}
}
//利用optional写法
String name=Optional.ofNullable(a).map(a1 ->a1.getB()).map(b1 -> b1.getName()).orElse(null);
System.out.println(name);
}
}
class A{
private B b;
public B getB() {
return b;
}
public void setB(B b) {
this.b = b;
}
}
class B{
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
isPresent方法
if (Optional.ofNullable(new A()).isPresent()){
System.out.println("这个对象不是null的");
}
//输出:这个对象不是null的
ifPresent(Consumer<? super T> consumer): 如果 Optional 对象包含非空值,则执行传入的操作
Optional.ofNullable(new A()).ifPresent(a1 -> System.out.println("我不是null"));
//我不是null
orElse(T other):如果为空输出t
System.out.println(Optional.ofNullable(null).orElse("hello"));
//hello
map:转换值类型
A a2=new A();
B b2=new B();
b2.setName("tom");
a2.setB(b2);
String name=Optional.ofNullable(a2).map(a3 -> a3.getB()).map(b3 ->b3.getName()).orElse(null);
System.out.println(name);
//tom
filter()
A a2=new A();
B b2=new B();
b2.setName("tom");
a2.setB(b2);
String name1=Optional.ofNullable(a2).map(a3 -> a3.getB()).map(b3 ->b3.getName()).filter(names -> "tom".equalsIgnoreCase(names)).orElse(null);
System.out.println(name1);
//true
注意:
1.optional容易造成代码冗长,本来一个null值就可以解决
2.引入多一个对象多一个开销,如果本身追求速度,就不用刻意这样
3.再者如果嵌套多层对象还这么使用,开发的可能感觉很牛,但是代码可读性差
在某些情况下,直接使用 null 可能是更简单和清晰的选择
使用 Optional 主要是为了增加对空值的明确处理,使代码更加防御性和易读