不废话,上干货:
1、Optional类是一个包装非空对象的容器类型。
2、Optional对象使用缺失值表示null值,其表达的意思即为值有可能为null。
没错,JAVA8引入此类的目的就是为了在java系统中减少空指针异常。
使用实例一:
public Optional<Customer>findCustomerWithSSN(String ssn) {
...
}
Optional<Customer> optional = findCustomerWithSSN(ssn);
if (optional.isPresent()) {
Customercustomer = maybeCustomer.get();
... usecustomer ...
}
else {
...deal with absence case ...
}
使用实例二:
optional.ifPresent(ssn -> {
String s = ssn.toUpperCase();
System.out.println("The longest name is "+ s);
});
findCustomerWithSSN(ssn).ifPresent(() ->
System.out.println("customerexists!"));
使用实例三:
Long value =findOptionalLong(ssn).orElse(0L);
注意的是:
它不是为了避免所有的空指针类型机制。方法或构造函数输入参数强制性检查就仍然是有必要的。划重点!
在以下场景一般不建议使用Optional类。
领域模型层(非序列化)、数据传输对象(同上原因)、方法的输入参数、构造函数参数
在浏览其他大神的文章时看到这个例子,很典型。如下:
public static void main(String args[]) {
Java8Tester java8Tester = new Java8Tester();
Integer value1 = null;
Integer value2 = new Integer(10);
// Optional.ofNullable - 允许传递为 null 参数
Optional<Integer> a = Optional.ofNullable(value1);
// Optional.of - 如果传递的参数是 null,抛出异常 NullPointerException
Optional<Integer> b = Optional.of(value2);
System.out.println(java8Tester.sum(a, b));
}
public Integer sum(Optional<Integer> a, Optional<Integer> b) {
// Optional.isPresent - 判断值是否存在
System.out.println("第一个参数值存在: " + a.isPresent());
System.out.println("第二个参数值存在: " + b.isPresent());
// Optional.orElse - 如果值存在,返回它,否则返回默认值
Integer value1 = a.orElse(new Integer(0));
//Optional.get - 获取值,值需要存在
Integer value2 = b.get();
return value1 + value2;
}