使用 Java8 Optional 的正确姿势

Optional 类已经成为 Java 8 类库的一部分,用来解决空指针异常。
最简单的使用,如下:

Optional<Integer> optVal = Optional.ofNullable(val);
if (optVal.isPresent()) {
       System.out.println(optVal.get());
}else{
  System.out.println("空值");
}

其实这样是等同于jdk8之前的使用方式:

        if (val!=null) {
            System.out.println(optVal.get());
        }else{
            System.out.println("空值");
        }

所以我们需要关注下面这些方法:

public<U> Optional<U> map(Function<? super T, ? extends U> mapper)
public T orElse(T other)
public T orElseGet(Supplier<? extends T> other)
public void ifPresent(Consumer<? super T> consumer)
public Optional<T> filter(Predicate<? super T> predicate)
public<U> Optional<U> flatMap(Function<? super T, Optional<U>> mapper)
public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X

下面我们一一尝试,先简单描述一下Optional 类的构造方法:

  • 方法 Optional.of(T value) 给定的值一定不为空,如果为空则抛出
    NullPointerException

    -方法 Optional.ofNullable(T value) 给定的值可能为空,也可能不为空
  • 方法 Optional.empty() 空的Optional

方法ifPresent的使用

Optional<Integer> optVal = Optional.ofNullable(val);
optVal.ifPresent((s)-> System.out.println(s));

如果存在值,则输出

方法orElse的使用

Optional<Integer> optVal = Optional.ofNullable(val);
Integer orElse = optVal.orElse(1);

如果存在返回当前值,否则返回1

方法orElseGet的使用

Integer orElseGet = optVal.orElseGet(() -> returnInt());
private int returnInt() {
    return 2;
}

如果存在返回当前值,否则返回方法调用方法返回的值

方法orElseThrow的使用

Integer orElseThrow = optVal.orElseThrow(() -> new RuntimeException("参数为空"));

如果存在返回当前值,否则抛出异常

方法map的使用

User user = new User();
user.setName("optional");
Optional<User> optUer = Optional.of(user);
String name = optUer.map(s -> s.getName()).map(s -> s.toUpperCase()).orElse("空值");

这段代码其实和下面这一段很类似

if (user != null) {
      String name1 = user.getName();
      if (name1 != null) {
            System.out.println(name1.toUpperCase());
      }else {
           System.out.println("空值");
        }
  }else {
       System.out.println("空值");
 }

但是通过对比能看出使用 Optional 后代码更加见解和明了

原文地址

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值