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