java8 Optional使用總結


【前言】 java8新特性

java8 函數接口

java8 lambda表達式

Java 8 時間日期使用

 

java8 推出的Optional的目的就是為了杜絕空指針異常,幫助開發者開發出更優雅的代碼,使用Optional不正確時,將會違背設計者的初衷。

一、Optional的構造方式:

1、Optional.of(T)  

該方式的入參不能為null,否則會有NPE,在確定入參不為空時使用該方式。

2、Optional.ofNullable(T)

該方式的入參可以為null,當入參不確定為非null時使用。

3、Optional.empty()

這種方式是返回一個空Optional,等效Optional.ofNullable(null)

二、 如何正確使用Optional

盡量避免使用的地方:

1、避免使用Optional.isPresent()來檢查實例是否存在,因為這種方式和null != obj沒有區別,這樣用就沒什么意義了。

2、避免使用Optional.get()方式來獲取實例對象,因為使用前需要使用Optional.isPresent()來檢查實例是否存在,否則會出現NPE問題。

3、避免使用Optional作為類或者實例的屬性,而應該在返回值中用來包裝返回實例對象。

4、避免使用Optional作為方法的參數,原因同3。

正確使用方式:

1、實例對象存在則返回,否則提供默認值或者通過方法來設置返回值,即使用orElse/orElseGet方式:

        //存在則返回
     User king = new User(1, "king"); Optional<User> userOpt = Optional.of(king); User user = userOpt.orElse(null); System.out.println(user.getName());
        //不存在提供默認值
User user2 = null; Optional<User> userOpt2 = Optional.ofNullable(user2); User user3 = userOpt2.orElse(unknown); System.out.println(user3.getName());
        //通過方法提供值
User user4 = userOpt2.orElseGet(() -> new User(0, "DEFAULT"));
System.out.println(user4.getName())

不建議這樣使用:

        if(userOpt.isPresent()) {
            System.out.println(userOpt.get().getName());
        } else {
            //。。。
        }

2、使用ifPresent()來進行對象操作,存在則操作,否則不操作。

        //實例存在則操作,否則不操作
        userOpt.ifPresent(u -> System.out.println(u.getName()));
        userOpt2.ifPresent(u -> System.out.println(u.getName()));

3、使用map/flatMap來獲取關聯數據

        //使用map方法獲取關聯數據
        System.out.println(userOpt.map(u -> u.getName()).orElse("Unknown"));
        System.out.println(userOpt2.map(u -> u.getName()).orElse("Default"));
        //使用flatMap方法獲取關聯數據
        List<String> interests = new ArrayList<String>();
        interests.add("a");interests.add("b");interests.add("c");
        user.setInterests(interests);
        List<String> interests2 = Optional.of(user)
                .flatMap(u -> Optional.ofNullable(u.getInterests()))
                .orElse(Collections.emptyList());
        System.out.println(interests2.isEmpty());

三、總結

以上對於Optional的使用只是個人經常使用的一些總結,如有不對之處望糾正。正確使用Optiona不僅可以避免NPE問題,還可以使代碼看起來更加簡潔。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM