談談java8新特性Optional

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及關鍵點如上,注意比較ofofNullable經常會有出現使用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的詳細用法,有興趣的可以自己試一下。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章