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