java.lang.NullPointerException
相信對每一個java程序員來說都不陌生的,常常因爲缺少一個判空導致系統各自通訊錯誤,異常。從java8開始,給我們提供了一個對象判空操作處理類Optional。
根據jdk8官方文檔,可以知道,該根據類存在於java.util下的final類,也就是說是官方提供給我們的一個工具類。
當然首先我們來看下具體的使用方法:
Optional<String> optionalS = Optional.of(new String("baomw"));
System.out.println(optionalS.get());
如上,代碼非常簡單:效果如下
核心api說明如下:
方法 描述
api | 說明 |
---|---|
of | 把指定的值封裝爲Optional對象,如果指定的值爲null,則拋出NullPointerException |
ofNullable | 把指定的值封裝爲Optional對象,如果指定的值爲null,則創建一個空的Optional對象 |
get | 如果創建的Optional中有值存在,則返回此值,否則拋出NoSuchElementException |
isPresent | 如果創建的Optional中的值存在,返回true,否則返回false |
ifPresent | 如果創建的Optional中的值存在,則執行該方法的調用,否則什麼也不做 |
orElse | 如果創建的Optional中有值存在,則返回此值,否則返回一個默認值 |
orElseGet | 如果創建的Optional中有值存在,則返回此值,否則返回一個由Supplier接口生成的值 |
empty | 創建一個空的Optional對象 |
orElseThrow | 如果創建的Optional中有值存在,則返回此值,否則拋出一個由指定的Supplier接口生成的異常 |
filter | 如果創建的Optional中的值滿足filter中的條件,則返回包含該值的Optional對象,否則返回一個空的Optional對象 |
map | 如果創建的Optional中的值存在,對該值執行提供的Function函數調用 |
flagMap | 如果創建的Optional中的值存在,就對該值執行提供的Function函數調用,返回一個Optional類型的值,否則就返回一個空的Optional對象 |
/**
* Common instance for {@code empty()}.
*/
private static final Optional<?> EMPTY = new Optional<>();
/**
* Returns an {@code Optional} with the specified present non-null value.
*
* @param <T> the class of the value
* @param value the value to be present, which must be non-null
* @return an {@code Optional} with the value present
* @throws NullPointerException if value is null
*/
public static <T> Optional<T> of(T value) {
return new Optional<>(value);
}
/**
* Returns an {@code Optional} describing the specified value, if non-null,
* otherwise returns an empty {@code Optional}.
*
* @param <T> the class of the value
* @param value the possibly-null value to describe
* @return an {@code Optional} with a present value if the specified value
* is non-null, otherwise an empty {@code Optional}
*/
public static <T> Optional<T> ofNullable(T value) {
return value == null ? empty() : of(value);
}
/**
* If a value is present in this {@code Optional}, returns the value,
* otherwise throws {@code NoSuchElementException}.
*
* @return the non-null value held by this {@code Optional}
* @throws NoSuchElementException if there is no value present
*
* @see Optional#isPresent()
*/
public T get() {
if (value == null) {
throw new NoSuchElementException("No value present");
}
return value;
}
/**
* Return {@code true} if there is a value present, otherwise {@code false}.
*
* @return {@code true} if there is a value present, otherwise {@code false}
*/
public boolean isPresent() {
return value != null;
}
核心api及關鍵點如上,注意比較of 和ofNullable經常會有出現使用Optional.of創建Optional對象時報空指針,因爲(如下)是of創建Optional對象的構造方法,發現如果傳入的value爲null時,會拋出一個空指針異常。
private Optional(T value) {
this.value = Objects.requireNonNull(value);
}
public static <T> T requireNonNull(T obj) {
if (obj == null)
throw new NullPointerException();
return obj;
}
而對於ofNullable上述源碼可以看出,有一個三目表達式,如果value爲空,則創建一個空的Optional對象。
public static <T> Optional<T> ofNullable(T value) {
return value == null ? empty() : of(value);
}
如上可以根據實際需要適當選取構造方法。
經常在代碼中會有這樣的寫法,如果值爲空就給個默認值的情況:
if(str == null){
return new String("baomw");
}else{
return str;
}
當然如果用Optional.orElse(method)就使得這樣子的寫法異常簡單。
return Optional.ofNullable(str).orElse(new String("baomw"));
使用orElse方法,就很好的解決了,如果值不爲空則返回,否則執行orElse裏面的方法並返回其返回值。
關於更多其他api的詳細用法,有興趣的可以自己試一下。