Optional的常見用法


package com.jwx.digital.client;

import com.jwx.digital.client.pojo.dto.ChildDTO;
import org.junit.Test;

import java.util.Optional;

/**
 * OptionalTest
 *
 * @author lvjijun
 * @version 1.0
 * @Date 2020-11-06
 */
public class OptionalTest {

    public static void main(String[] args) {
        ChildDTO childDTO = new ChildDTO("123");
        childDTO.setChilAddress("高新園");
        System.out.println(getChilAddress(childDTO));
        System.out.println(getChilAddressNew(childDTO));
    }

    /**
     * Optional類是Java8為了解決null值判斷問題,借鑒google guava類庫的Optional類而引入的一個同名Optional類,
     * 使用Optional類可以避免顯式的null值判斷(null的防御性檢查),避免null導致的NPE(NullPointerException)。
     */

    /**
     * 這是一個獲取兒童住址的方法,方法入參為一個ChildDTO對象,childDTO, 做了防御性檢查:如果值為null,返回"Unkown"。
     */
    public static String getChilAddress(ChildDTO childDTO){
        if(childDTO==null){
            return "unknown";
        }else {
            return childDTO.getChilAddress();
        }
    }


    /**
     * 再看使用Optional優化后的方法
     */
    public static String getChilAddressNew(ChildDTO childDTO){
        return Optional.ofNullable(childDTO).map(c -> c.getChilAddress()).orElse("unknown");
    }

    /**
     * 二.Optional對象的創建
     *
     * Optional類的兩個構造方法都是private型的,因此類外部不能顯示的使用new Optional()的方式來創建Optional對象,
     * 但是Optional類提供了三個靜態方法empty()、of(T value)、ofNullable(T value)來創建Optinal對象,示例如下:
     */
    @Test
    public void createOptional(){
        // 1、創建一個包裝對象值為空的Optional對象
        Optional<String> optional = Optional.empty();

        // 2、創建包裝對象值非空的Optional對象
        Optional<String> optionalStr = Optional.of("optional");

        // 3、創建包裝對象值允許為空的Optional對象
        Optional<String> optionalStr2 = Optional.ofNullable(null);

    }

    /**
     * 三.Optional 類典型方法使用
     */
    @Test
    public void OptionalUsage(){
      //  get()   獲取包裝的對象
        ChildDTO childDTO = new ChildDTO("123");
        childDTO.setChilAddress("高新園");
        ChildDTO childDTO1 = Optional.ofNullable(childDTO).get();
        System.out.println(childDTO1);

        //isPresent()
        //返回true
        boolean present = Optional.of(childDTO).isPresent();
        System.out.println(present);

        //NullPointerException
        //boolean present2 = Optional.of(null).isPresent();
        //System.out.println(present2);

        //返回false
        boolean present3 = Optional.ofNullable(null).isPresent();
        System.out.println(present3);


        //ifPresent()  fPresent()方法內部做了null值檢查,調用前無需擔心childDTO2.getChilBirthday() NPE問題。
        Optional.of(childDTO).ifPresent(childDTO2 -> System.out.println(childDTO2.getChilBirthday()));

        //filter()方法  篩選
        ChildDTO childDTO2 = new ChildDTO("66666");
        ChildDTO childDTO3 = new ChildDTO("33333");
        //不輸出
        Optional.ofNullable(childDTO2).filter(c -> c.getChilNo().equals("33333")).ifPresent(c -> System.out.println("兒童"+c+"編碼是"+"33333") );
        //輸出
        Optional.ofNullable(childDTO3).filter(c -> c.getChilNo().equals("33333")).ifPresent(c -> System.out.println("兒童"+c+"編碼是"+"33333") );

        
    }

}

  


免責聲明!

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



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