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