Java8 Optional 使用

177 阅读1分钟
//不允许为空 为空时报 NullPointerException
Optional<Object> optional = Optional.of(new ListContact());//Optional 中的范型会影响为空时提供的默认值

//允许为空 为空时返回默认 private static final Optional<?> EMPTY = new Optional<>();  此时 value 为空
Optional<Object> optional1 = Optional.ofNullable(null);

//针对value 的判断 返回boolean 值
optional.isPresent();

optional.ifPresent(System.out::println);//传 Consumer 函数  调用accept方法  有参无返回值

//非空则返回 为空则返回默认值
Object o1 = optional.orElse("为空时默认值");
////非空则返回 为空则返回 传的Supplier 函数实现 对应的返回值  几种不同的写法
optional.orElseGet(() -> supplierGetmethod());
optional.orElseGet(() -> "返回值");
optional.orElseGet(() -> {
    return "返回值";
});
Object o = optional.orElseThrow(() -> supplierGetmethodException());
optional.orElseThrow(() -> new RuntimeException("自定义异常"));//
optional.orElseThrow(RuntimeException::new);//


Optional<ListContact> optional2 = Optional.of(new ListContact());
//执行map 的时候 a.getContact() 若为null 则会默认返回一个empty Optional 此时value 为null  orElse 判断部位空返回map 返回的value  若为空 执行 orElse默认逻辑
optional2.map(a -> a.getContact()).orElse(Collections.emptyList());
//对比Java8 之前的写法
if (optional2.isPresent()) {
    optional2.get().getContact();
} else {
    Collections.emptyList();
}
//map 可以无限下推逻辑
optional2.map(a -> a.getChannel()).map(channel -> channel.toUpperCase()).orElse(null);