Java8————Optional

引言

Optional 类是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。

Optional 是个容器:它可以保存类型T的值,或者仅仅保存null。Optional提供很多有用的方法,这样我们就不用显式进行空值检测。

Optional 类的引入很好的解决空指针异常。

 

示例代码

/**
 * Optional使用详解: 使用 Optional 时尽量不直接调用 Optional.get() 方法, Optional.isPresent()
 * 更应该被视为一个私有方法, 应依赖于其他像 Optional.orElse(), Optional.orElseGet(), Optional.map()
 * 等这样的方法. <br>
 * 类名:T<br>
 * 作者: mht<br>
 * 日期: 2018年9月2日-下午10:47:42<br>
 */
public class T {
    public static void main(String[] args) {
        /* 1. 三个构造器 */
        // 它要求传入的 obj 不能是 null 值的, 否则还没开始进入角色就倒在了 NullPointerException 异常上.
        Optional<User> opt1 = Optional.of(new User());
        // value == null ? empty() : of(value);
        Optional<User> opt2 = Optional.ofNullable(null);
        // 直接返回一个空的Optional对象
        Optional<User> opt3 = Optional.empty();
        System.out.println("#1 output: " + opt1 + " , " + opt2 + " , " + opt3);

        /* 2. 存在即返回, 无则提供默认值 */
        // 这种方法可以取代三目运算符的非空判断与默认值赋值。
        User u = opt1.orElse(new User(2, "小明"));
        User u2 = opt2.orElse(new User(2, "小明"));
        System.out.println("#2 output: " + u + " ; " + u2);
        /* 3.存在即返回, 无则由函数来产生 ,和上一个类似 */
        User u3 = opt2.orElseGet(() -> {
            return new User(3, "波多老师");
        });
        // 或者写成 >>> User u3 = opt2.orElseGet(() -> new User(3,"波多老师"));
        System.out.println("#3 output: " + u3);
        /* 4. 存在就对它做点什么 */
        opt1.ifPresent(user -> System.out.println("#4 output: " + user.getName()));
        opt2.ifPresent(user -> System.out.println("#4 output: " + user.getName()));
        /* 5. map函数 */
        // map函数判断isPresent() == true时,执行参数列表中的代码,以为返回的是Optional<T>所以可以配合orElse和orElseGet一起使用。
        User qiao = new User(100, "da-qiao-wei-jiu");
        String name = opt2.map(user -> user.getName()).orElseGet(() -> qiao.getName());
        System.out.println("#5 output: " + name);
        // 多个map级联
        Optional<User> teacherOpt = Optional.of(new User(19, "da-qiao-wei-jiu"));
        String name2 = teacherOpt.map(user -> user.getName()).map(n -> n.toUpperCase()).orElse("sss");
        System.out.println("#6 output: " + name2);
    }
}

class User {
    private Integer score = 1;
    private String name = "苍老师";

    public User() {
    }

    public User(Integer score, String name) {
        this.score = score;
        this.name = name;
    }

    public Integer getScore() {
        return score;
    }

    public void setScore(Integer score) {
        this.score = score;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "{score : " + score + ", name : " + name + "}";
    }

}

执行结果:

 

相关推荐
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页