Java8的Optional:如何幹掉空指針?

Optional概述

Optional 是個容器:它能夠保存類型T的value,或者僅僅保存null。Optional提供不少有用的方法,這樣咱們就不用顯式進行空值檢測,很好地解決了空指針異常處理的問題,好比可使用isPresent()方法判斷value是否爲null,使用get()方法獲取value值等等。html

Optional的構造方法是私有的,實例不能new,可使用靜態方法來建立:java

// 一、建立一個包裝對象值爲空的Optional對象
Optional<String> optStr = Optional.empty();
// 二、建立包裝對象值非空的Optional對象
Optional<String> optStr1 = Optional.of("optional");
// 三、建立包裝對象值容許爲空的Optional對象
Optional<String> optStr2 = Optional.ofNullable(null);

Optional簡單案例

看完Optional的概述,咱們用一個簡單的例子說明一下:git

下面這段代碼接收一個User對象,若是user爲null,則拋出異常【這是一個很是常規的避免空指針異常的作法,若是沒有這步,getName會NPE】,不然返回user的name。github

public String getName1(User user) {
        if (user == null) {
            throw new RuntimeException("user不能爲null!");
        }
        return user.getName();
    }

若是使用Optional,應該怎麼去處理呢?app

public String getName2(User user) {
        return Optional.ofNullable(user) // 包裝user對象,若是user爲null,則返回空的Optional對象
                .map(User::getName)
                .orElseThrow(() -> new RuntimeException("user不能爲null"));// 若是有值則返回,沒有則拋出異常。
    }
  • Optional使用靜態的ofNullable方法將user對象進行包裝,將可能爲null的user對象保護起來。
public static <T> Optional<T> ofNullable(T value) {
        // empty() 方法 建立一個空的Optional對象, of對象在構造Optional的時候,value若是weinull,會引起NPE
        return value == null ? empty() : of(value);
    }
public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X {
        // 若是有值,直接返回值
        if (value != null) {
            return value;
        } else {
            // 拋出異常,這個異常Supplier接口定義
            throw exceptionSupplier.get();
        }
    }

Optional的主要方法

方法 描述
empty 返回一個空的 Optional 實例
filter 若是值存在而且知足提供的斷言, 就返回包含該值的 Optional 對象;不然返回一個空的 Optional 對象
map 若是值存在,就對該值執行提供的 mapping 函數調用
flatMap 若是值存在,就對該值執行提供的 mapping 函數調用,返回一個 Optional 類型的值,不然就返 回一個空的 Optional 對象
get 若是該值存在,將該值用 Optional 封裝返回,不然拋出一個 NoSuchElementException 異常
ifPresent 若是值存在,就執行使用該值的方法調用,不然什麼也不作
isPresent 若是值存在就返回 true,不然返回 false
of 將指定值用 Optional 封裝以後返回,若是該值爲 null,則拋出一個 NullPointerException 異常
ofNullable 將指定值用 Optional 封裝以後返回,若是該值爲 null,則返回一個空的 Optional 對象
orElse 若是有值則將其返回,不然返回一個默認值
orElseGet 若是有值則將其返回,不然返回一個由指定的 Supplier 接口生成的值
orElseThrow 若是有值則將其返回,不然拋出一個由指定的 Supplier 接口生成的異常

參考閱讀

相關文章
相關標籤/搜索