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") ); } }