版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014745069/article/details/82321033
引言
Optional 类是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。
Optional 是个容器:它可以保存类型T的值,或者仅仅保存null。Optional提供很多有用的方法,这样我们就不用显式进行空值检测。
Optional 类的引入很好的解决空指针异常。
示例代码
/**
* Optional使用详解: 使用 Optional 时尽量不直接调用 Optional.get() 方法, Optional.isPresent()
* 更应该被视为一个私有方法, 应依赖于其他像 Optional.orElse(), Optional.orElseGet(), Optional.map()
* 等这样的方法. <br>
* 类名:T<br>
* 作者: mht<br>
* 日期: 2018年9月2日-下午10:47:42<br>
*/
public class T {
public static void main(String[] args) {
/* 1. 三个构造器 */
// 它要求传入的 obj 不能是 null 值的, 否则还没开始进入角色就倒在了 NullPointerException 异常上.
Optional<User> opt1 = Optional.of(new User());
// value == null ? empty() : of(value);
Optional<User> opt2 = Optional.ofNullable(null);
// 直接返回一个空的Optional对象
Optional<User> opt3 = Optional.empty();
System.out.println("#1 output: " + opt1 + " , " + opt2 + " , " + opt3);
/* 2. 存在即返回, 无则提供默认值 */
// 这种方法可以取代三目运算符的非空判断与默认值赋值。
User u = opt1.orElse(new User(2, "小明"));
User u2 = opt2.orElse(new User(2, "小明"));
System.out.println("#2 output: " + u + " ; " + u2);
/* 3.存在即返回, 无则由函数来产生 ,和上一个类似 */
User u3 = opt2.orElseGet(() -> {
return new User(3, "波多老师");
});
// 或者写成 >>> User u3 = opt2.orElseGet(() -> new User(3,"波多老师"));
System.out.println("#3 output: " + u3);
/* 4. 存在就对它做点什么 */
opt1.ifPresent(user -> System.out.println("#4 output: " + user.getName()));
opt2.ifPresent(user -> System.out.println("#4 output: " + user.getName()));
/* 5. map函数 */
// map函数判断isPresent() == true时,执行参数列表中的代码,以为返回的是Optional<T>所以可以配合orElse和orElseGet一起使用。
User qiao = new User(100, "da-qiao-wei-jiu");
String name = opt2.map(user -> user.getName()).orElseGet(() -> qiao.getName());
System.out.println("#5 output: " + name);
// 多个map级联
Optional<User> teacherOpt = Optional.of(new User(19, "da-qiao-wei-jiu"));
String name2 = teacherOpt.map(user -> user.getName()).map(n -> n.toUpperCase()).orElse("sss");
System.out.println("#6 output: " + name2);
}
}
class User {
private Integer score = 1;
private String name = "苍老师";
public User() {
}
public User(Integer score, String name) {
this.score = score;
this.name = name;
}
public Integer getScore() {
return score;
}
public void setScore(Integer score) {
this.score = score;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "{score : " + score + ", name : " + name + "}";
}
}
执行结果: