Java8 Optional类的使用

Optional<T>类(java.util.Optional)是一个容器类,代表一个值存在或不存在,原来用null表示一个值不存在,现在Optional可以更好的表达这个概念。并且可以避免空指针异常。

常用方法:

  • Optional.of(T t):创建一个Optional实例。
  • Optional.empty():创建一个空的Optional实例。
  • Optional.ofNullable(T t):若t不为null,创建Optional实例,否则创建空实例。
  • isPresent():判断是否包含值,若存在返回 true,否则为 false。
  • orElse(T t):如果调用对象包含值,返回该值,否则返回t。
  • orElseGet(Supplier s):如果调用对象包含值,返回该值,否则返回s获取的值。
  • map(Function f):如果有值对其处理,并返回处理后的Optional,否则返回Optional.empty()。
  • flatMap(Function mapper):与map类似,要求返回值必须是Optional。

例1:

/**
 * Optional容器类常用方法
 */
public class TestOptional {
    /**
     * Optional.of(T t):创建一个Optional实例。
     */
    @Test
    public void test01() {
        Optional<Employee> op = Optional.of(new Employee());
        Employee employee = op.get();
        System.out.println(employee);

        //快速锁定空指针位置,此方法不能构建null实例
        /*Optional<Object> o = Optional.of(null);
        System.out.println(o.get());*/
    }

    /**
     * Optional.empty():创建一个空的Optional实例。
     */
    @Test
    public void test02() {
        Optional<Object> empty = Optional.empty();//创建空实例
        System.out.println(empty.get());//获取不到值
    }

    /**
     * Optional.ofNullable(T t):若t不为null,创建Optional实例,否则创建空实例。
     */
    @Test
    public void test03() {
        Optional<Employee> op1 = Optional.ofNullable(new Employee());
        System.out.println(op1.get());
        /**
         * isPresent():判断是否包含值,若存在返回 true,否则为 false。
         */
        if (op1.isPresent()) {
            System.out.println(op1.get());//获取不到值
        }

        Optional<Employee> op2 = Optional.ofNullable(null);//创建空实例
        /**
         * orElse(T t):如果调用对象包含值,返回该值,否则返回t。
         */
        Employee employee1 = op2.orElse(new Employee("张三", 26, 8888.88, Employee.Status.BEAUTIFUL));
        System.out.println(employee1);

        /**
         * orElseGet(Supplier s):如果调用对象包含值,返回该值,否则返回s获取的值。
         */
        Employee employee2 = op2.orElseGet(() -> new Employee());
        System.out.println(employee2);
    }

    /**
     * map(Function f):如果有值对其处理,并返回处理后的Optional,否则返回Optional.empty()。
     * flatMap(Function mapper):与map类似,要求返回值必须是Optional。
     */
    @Test
    public void test04() {
        Optional<Employee> op = Optional.ofNullable(new Employee("张三", 26, 8888.88, Employee.Status.BEAUTIFUL));
        Optional<String> name1 = op.map((emp) -> emp.getName());
        System.out.println(name1.get());

        Optional<String> name2 = op.flatMap((emp) -> Optional.of(emp.getName()));
        System.out.println(name2.get());
    }

}

例2:获取男人心中的女神名字,男人心中有女神,但不一定每个男人心中都有女神,而女神一定会有个名字。

原始方法处理空指针:

public class Man {

    private Goddess goddess;//女神

    public Man() {
    }

    public Man(Goddess goddess) {
        this.goddess = goddess;
    }

    public Goddess getGoddess() {
        return goddess;
    }

    public void setGoddess(Goddess goddess) {
        this.goddess = goddess;
    }
}
public class Goddess {

    private String username;

    public Goddess() {
    }

    public Goddess(String username) {
        this.username = username;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }
}
    @Test
    public void test01() {
        Man man = new Man();
        String goddessName = getGoddessName(man);
        System.out.println(goddessName);
    }

    /**
     * 原始方法处理空指针:获取男人心中女神的名字
     *
     * @param man
     * @return
     */
    public String getGoddessName(Man man) {
        //处理空指针异常
        if (man != null) {
            Goddess goddess = man.getGoddess();
            if (goddess != null) {
                return goddess.getUsername();
            }
        }
        //默认返回
        return "赵丽颖";
    }

Java8中Optional类方法处理空指针:

public class NewMan {

    private Optional<Goddess> goddess = Optional.empty();//空实例

    public NewMan() {
    }

    public NewMan(Optional<Goddess> goddess) {
        this.goddess = goddess;
    }

    public Optional<Goddess> getGoddess() {
        return goddess;
    }

    public void setGoddess(Optional<Goddess> goddess) {
        this.goddess = goddess;
    }

}
    @Test
    public void test02() {
        //传入 空实例时输出默认值
        Optional<NewMan> newMan1 = Optional.ofNullable(null);
        //传入 创建的男生实例但没有女神,输出默认值
        Optional<NewMan> newMan2 = Optional.ofNullable(new NewMan());
        //创建女神
        Optional<Goddess> goddess = Optional.ofNullable(new Goddess("杨幂"));
        //传入 创建的男生实例并且传入创建的女神实例,输出传入的女神实例名
        Optional<NewMan> newMan3 = Optional.ofNullable(new NewMan(goddess));

        System.out.println(getGoddessNameNew(newMan1));
        System.out.println(getGoddessNameNew(newMan2));
        System.out.println(getGoddessNameNew(newMan3));
    }

    /**
     * Java8中Optional类方法处理空指针:获取男人心中女神的名字
     * 注:传进来的newMan也可能为空所以要用Optional包装
     *
     * @param newMan
     * @return
     */
    public String getGoddessNameNew(Optional<NewMan> newMan) {
        return newMan.orElse(new NewMan())
                .getGoddess()
                .orElse(new Goddess("赵丽颖"))
                .getUsername();
    }

 

转载请注明出处:BestEternity亲笔。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值