最近看核心卷注意到了Java8新增的Optional类,对于经常遇到的空指针异常(NullPointException)有很好的解决效果,可以优雅的判空及替换空值。
Optional的作用
Optional<T>对象是一种包装器对象,可以包装 类型T,也可以没有包装任何对象。对于前一种情况,我们称为这种值存在。
Optional<T>类型被当作一种更安全的方式,用来代替T的引用,这种引用要么引用某个对象,要么为null。但是只有在正确使用方式下才会更安全。
Optional的正确使用
Optional的正确使用关键在于:
它在值不存在的情况下会产生一个可替代物,而只有值存在的情况下才会使用这个值。
下面举一个简单应用的例子:
例子user实例类
public class User {
private int userId;
private String userName;
private int age;
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
在这我们做个测试类用Optional来包装user类,在user属性有值时显示那个值,为null时就用"unknown"代替
public class OptionalTest1 {
public static String getUserName (User user) {
return Optional.ofNullable(user).map(User -> User.getUserName()).orElse("Unknown");
}
public static void main(String[] args) {
User user = new User();
user.setUserId(1);
// user.setUserName("tz");
user.setAge(12);
String userName = getUserName(user);
System.out.println("userName = " + userName);
}
}
当不注释userName赋值语句时,结果为:
userName = tz
注释掉userName赋值语句,则user实例中userName为null,则会被替换成unknown,结果为:
userName = Unknown
关键语句在于:
Optional.ofNullable(user).map(User -> User.getUserName()).orElse("Unknown");
这一使用也可以被用到包装map当中,
public static String getMapUserName(Map<String, String> map) {
return Optional.ofNullable(map).map(map1 -> map1.get("userName")).orElse("unknowMapName");
}
public static void main(String[] args) {
Map<String,String> map = new HashMap<>();
map.put("userId", "1");
//map.put("userName","tz");
String mapUserName = getMapUserName(map);
System.out.println("MapUserName = " + mapUserName);
}
空值替换结果为:
MapUserName = unknowMapName
创建Optional
创建Opltional对象有三种方法,
Optional.empty();
Optional.of(object);
Optional.ofNullable(object);
Optional.empty();
Optional.empty() 是创建一个空的Optional对象。
Optional.of(object);
Optional.of(object)方法是创建一个非空的包装对象,若object为null就会报出异常。
Optional.ofNullable(object)
Optional.ofNullable(object) 是一个兼容方法,若object不为null,它就和of方法一样,当object为空时,他就创建一个空的optional对象
可以看看ofNullable方法的源码:
public static <T> Optional<T> ofNullable(T value) {
return value == null ? empty() : of(value);
}
在此做了判断,value为null就调用empty方法,不为null就调用of方法,可见ofNullable是一个兼容性的方法。
Optional常用API
T orElse(T other)
产生这个Optional的值,或者在该Optional为空时,产生other。
T orElseGet(Supplier<? extends T> other)
产生这个Optional的值,或者Optional为空时,产生调用other的结果。
<X extends Throwable> T orElseThrow(Supplier<? extend X> exceptionSupplier)
产生这个Optional的值,或者这个Optional为空时,抛出调用exceptionSupplier的结果。
void ifPresent(Cusumer<? super T> consumer)
若该Optional不为空,那么就将它的值传递给Consumer。
<U> Optional<U> map(Function<? super T, extends U> mapper)
产生将该Optional的值传递给mapper后的结果,只有这个Optional不为空且结果不为null,否则产生一个空的Optional。
其中map方法非常常用。
网友评论