Optional的使用

1.Optional的作用

它的设计目的是为了解决在代码中频繁出现的空指针异常问题。
在常规的代码当中,我们如果在一个A对象里面引用了B对象,当我们需要获取B对象的某一个值的操作的时候,要判断A对象里面是否为null,B对象是否为null,然后才能避免空指针的问题

2.Optional的常用api

1.Optional的创建

		//创建一个空的optional对象
        Optional.empty();
        //创建一个 optional 对象,如果传递的值为 null,仍然会创建一个空的 Optional 对象
        Optional.ofNullable("Hello");
        //创建一个包含非空值的 Optional 对象,如果传递的值为 null,会抛出 NullPointerException
        Optional.of(null);

2.常用的方法

isPresent(): 判断 Optional 对象是否包含非空值,对象有值返回true,否则为false
ifPresent(Consumer<? super T> consumer): 如果 Optional 对象包含非空值,则执行传入的操作
orElse(T other): 如果 Optional 对象包含非空值,则返回该值;否则返回传入的默认值
map() :转换值
filter() 接受一个 Predicate 参数,返回测试结果为 true 的值。如果测试结果为 false,会返回一个空的 Optional。

普通方法和optical的对比

package com.wu.test.optional;

import java.util.Optional;

public class Test {
    public static void main(String[] args) {
        A a=null;
        //获取A对象里面的B对象的name属性
        //常规写法
        if (a!=null){
            if (a.getB()!=null){
                System.out.println(a.getB().getName());
            }
        }
        //利用optional写法
        String name=Optional.ofNullable(a).map(a1 ->a1.getB()).map(b1 -> b1.getName()).orElse(null);
        System.out.println(name);
    }



}

class A{
    private B b;

    public B getB() {
        return b;
    }

    public void setB(B b) {
        this.b = b;
    }
}

class B{
    private String name;

    public String getName() {
        return name;
    }

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

isPresent方法

if (Optional.ofNullable(new A()).isPresent()){
            System.out.println("这个对象不是null的");
        }
//输出:这个对象不是null的

ifPresent(Consumer<? super T> consumer): 如果 Optional 对象包含非空值,则执行传入的操作

Optional.ofNullable(new A()).ifPresent(a1 -> System.out.println("我不是null"));

//我不是null

orElse(T other):如果为空输出t

System.out.println(Optional.ofNullable(null).orElse("hello"));

//hello

map:转换值类型

A a2=new A();
        B b2=new B();
        b2.setName("tom");
        a2.setB(b2);
        String name=Optional.ofNullable(a2).map(a3 -> a3.getB()).map(b3 ->b3.getName()).orElse(null);
          System.out.println(name);

//tom

filter()

		 A a2=new A();
        B b2=new B();
        b2.setName("tom");
        a2.setB(b2);
        String name1=Optional.ofNullable(a2).map(a3 -> a3.getB()).map(b3 ->b3.getName()).filter(names -> "tom".equalsIgnoreCase(names)).orElse(null);
        System.out.println(name1);
//true

注意:
1.optional容易造成代码冗长,本来一个null值就可以解决
2.引入多一个对象多一个开销,如果本身追求速度,就不用刻意这样
3.再者如果嵌套多层对象还这么使用,开发的可能感觉很牛,但是代码可读性差

在某些情况下,直接使用 null 可能是更简单和清晰的选择
使用 Optional 主要是为了增加对空值的明确处理,使代码更加防御性和易读

  • 10
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值