Optional详细用法

package com.example.apidemo.jdk8;

import com.example.apidemo.vo.UserInfo;
import java.math.BigDecimal;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import lombok.Data;
import org.junit.Test;

/**
 * @Author Tim
 * @Date 2022/5/19 10:54
 */
public class TestOptional {

    /**
     * Optional 类是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。
     * Optional 是个容器:它可以保存类型T的值,或者仅仅保存null。
     * Optional提供很多有用的方法,这样我们就不用显式进行空值检测。
     * Optional 类的引入很好的解决空指针异常。
     */
    @Test
    public void test() throws Exception {
        String s = "2";
        String value = Optional.ofNullable(s).orElse("ab");
        System.out.println("Test=="+ value + "|" + value.length());

        //创建一个Optional容器对象
        Optional<String> optional = Optional.of("XiaoMing");

        //为指定的值创建一个Optional,如果指定的值为null,则返回一个空的Optional。Optional有值就返回,没有抛出NoSuchElementException
        Optional<Object> o1 = Optional.ofNullable(null);
        //System.out.println(o1.get());

        //orElse:如果有值则将其返回,否则返回指定的其它值
        System.out.println(o1.orElse("输出orElse"));

        //orElseGet与orElse方法类似,区别在于得到的默认值。orElse方法将传入的字符串作为默认值,orElseGet方法可以接受Supplier接口的实现用来生成默认值
        UserInfo userInfo = null;
        UserInfo u1 = Optional.ofNullable(userInfo).orElse(createNew());
        System.out.println(u1);
        UserInfo u2 = Optional.ofNullable(userInfo).orElseGet(()->createNew());
        System.out.println(u2);
        System.out.println("----------------------------------");

        //map:如果有值,则对其执行调用mapping函数得到返回值。如果返回值不为null,则创建包含mapping返回值的Optional作为map方法返回值,否则返回空Optional。
        String s1 = optional.map(e -> e.toUpperCase()).orElse("shiyilingfeng");
        System.out.println("s1=="+s1); //输出: XIAOMING

        //flatMap:如果有值,为其执行mapping函数返回Optional类型返回值,否则返回空Optional。与map不同的是,
        // flatMap 的返回值必须是Optional,而map的返回值可以是任意的类型T
        Optional<String> s2 = optional.flatMap(e -> Optional.of(e.toUpperCase()));
        System.out.println("s2=="+s2.get()); //输出:XIAOMING

        //filter
        List<String> strings = Arrays.asList("rmb", "doller", "ou");
        for (String str : strings) {
            String op = Optional.of(str).filter(g -> g.contains("o")).orElse("没有--包含o的");
            System.out.println(op);
        }
    }

    //createNew
    private static UserInfo createNew() {
        return new UserInfo("用户", 50, BigDecimal.ZERO, BigDecimal.ZERO);
    }

}

 

package com.example.apidemo.jdk8;

import java.util.Optional;
import lombok.Data;
import org.junit.Test;

/**
 * @Author Tim
 * @Date 2022/5/19 10:54
 */
public class TestOptional2 {

    /**
     *  3种真实场景下的测试案例
     */
    @Test
    public void test() throws Exception {
        //用法案例1:
        System.out.println(getCity(new User()));
        System.out.println(getCity2(new User()));

        //用法案例2:
        System.out.println(getDefaultUser(new User()));
        System.out.println(getDefaultUser2(new User()));

        //用法案例3: Optional取值,如果不存在则调用一个没返回值得方法
        Optional.ofNullable(new User()).ifPresent(u-> dosomething(u));
        // if(user != null){
        //     dosomething(user);
        // }
    }

    private void dosomething(User u) {}

    //1.旧写法(循环每一层判断下面是否有值)
    public String getCity(User user)  throws Exception{
        try {
            if(user!=null){
                if(user.getAddress()!=null){
                    Address address = user.getAddress();
                    if(address.getCity()!=null){
                        return address.getCity();
                    }
                }
            }
        } catch (Exception e) {
            throw new Exception("取值错误1");
        }
        return "取值错误1";
    }

    //1.新写法(用map去匹配)
    public String getCity2(User user) throws Exception{
        return Optional.ofNullable(user)
            .map(u-> u.getAddress())
            .map(a->a.getCity())
            .orElse("取值错误2");
    }


    //2. 以前写法   (获取指定的用户返回,没有就用默认的)
    public User getDefaultUser(User user) throws Exception{
        if(user!=null){
            String name = user.getName();
            if("zhangsan".equals(name)){
                return user;
            }
            return null;
        }else{
            user = new User();
            user.setName("zhangsan");
            return user;
        }
    }

    //2. java8写法
    public User getDefaultUser2(User user) {
        return Optional.ofNullable(user)
            .filter(u->"zhangsan2".equals(u.getName()))
            .orElseGet(()-> {
                User user1 = new User();
                user1.setName("zhangsan2");
                return user1;
            });
    }


    @Data
    public static class User {
        String name;
        Address address;
    }

    @Data
    public static class Address {
        String city;
    }


}

 

posted @ 2022-08-17 11:42  威兰达  阅读(105)  评论(0编辑  收藏  举报