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

        
    }

}

  

posted @ 2020-11-06 15:09  红叶如醉  阅读(4608)  评论(0编辑  收藏  举报