Java8新特性-Optional<T>(四)

Optional的作用

显示的告诉调用者这个值有可能是空值,需要显示的判断,避免出现空指针的异常。

例如:

public class People {


    //一个人,肯定是有头的
    private String head ;

    //但是一个人不一定有帽子, 
    private Optional<String> hat ;

    public String getHead() {
        return head;
    }

    public void setHead(String head) {
        this.head = head;
    }

    public Optional<String> getHat() {
        return hat;
    }

    public void setHat(Optional<String> hat) {
        this.hat = hat;
    }
}

在用户调用getHat()方法时,返回的是一个optional对象,调用者就意识到这个值有可能是空,需要进行null校验,避免出现空指针;相反调用getHead()方法时,返回的就是String,表示在这个对象中,head属性是不可能为空的,通过这种方式可以更好的理解一个对象中哪些属性是必然不为空的,而不是获取对象中每个属性都要去判断

Optional API

获取Optional对象

  • Optional.empty() 创建空对象
  • Optional.of() 根据一个值获取对象,注:如果传入的对象是一个控制,会报空指针异常 而不是在使用这个对象时才报空指针
  • Optional.ofNullable 根据一个值创建一个允许为null的对象,但是获取optional里面的对象时如果利用get方法获取里面的值时会报NoSuchElementException,应该用其他安全的方法获取里面的值
//创建空对象;
Optional<String> optStr = Optional.empty();

String s = "123";
//根据一个值创建对象
optStr = Optional.of(s);

try {
    //如果传入的值为空会立即抛出空指针异常
    optStr = Optional.of(null);
} catch (NullPointerException e) {
    System.out.println("catch NullPointerException");
}

//利用ofNullable方法创建允许对象是null,在获取optional里面的值时返回的是空对象
     optStr = Optional.ofNullable(null);
//利用ofNullable方法创建允许对象是null,在获取optional里面的值时返回的是空对象
     Optional<String> optStr2 = Optional.ofNullable(null);
        try {
            optStr2.get();
        } catch (NoSuchElementException e) {
            System.out.println("catch  NoSuchElementException  ");
        }

Optional的一些流处理

Optional提供一些数据处理的API,例如Optional.map(),Optional.filter;

Optioanl里的方法与stream里面的api类似,最大的好处在于会对里面的值进行安全(空值)过滤;看下面代码:

//filter 在使用Optional.filter的时候不会打印出+号,在filter时会自动过滤掉值为空的Optional
Optional<String> opt = Optional.ofNullable(null);
boolean a = opt.filter(str->{
    System.out.println("+++++++++++++");
    return 1 == str.length();
}).isPresent();
System.out.println("------filter  test ----"+a);


//map方法转换里面的值
Optional<String> opt3 = Optional.ofNullable(null);
Optional<Integer> o =  opt3.map(String::length);

控制台不会打出+号,opt3.map(String::length)或者str.length();不会因为我们在创建opt时传入的null造成空指针

Optional的取值

方法描述
get最简单但又最不安全的方法。如果变量存在,它直接返回封装的变量值,否则就抛出一个NoSuchElementException异常
orElse允许你在Optional对象不包含值时提供一个默认值
orElseGet默认值比较复杂时使用,延迟加载默认值
orElseThrow允许在Optional对象不包含值时抛出一个异常
ifPresent传入一个方法,在有值的时候调用
isPresent判断optional里面是否有有效元素
//是这些方法中最简单但又最不安全的方法。如果变量存在,它直接返回封装的变量
//值,否则就抛出一个NoSuchElementException异常
opt4.get();

//允许在Optional对象不包含值时提供一个默认值
opt4.orElse("default");

//默认值比较复杂时使用,延迟加载默认值
opt4.orElseGet(OptionalDemo::getFromDb);

//允许在Optional对象不包含值时抛出一个异常
opt4.orElseThrow(OptionalDemo::getMyException);

//传入一个方法,在有值的时候调用
opt4.ifPresent(System.out::println);

//判断optional里面是否有有效元素
boolean exit = optStr.isPresent();
  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值