前言

Optional是一个容器对象,用来判断对象是否为null,记住,只会判断是否为null,代替的 if else 的写法。废话不多说,下面就来看看一下写法吧。

代码

  1. 示例1:
String s = Optional.ofNullable(user)
                   .map(o -> o.getUsername())
                   .orElseGet(() -> { return "李四";});

用法说明:Optional.ofNullable(user)是判断user是否为null,如果为null,则不会执行map(o -> o.getUsername()),直接执行orElseGet(() -> { return “李四”;})方法。如果不为null,则只执行map(o -> o.getName())方法。
还有一个跟orElseGet()类似的方法:orElse(),orElse()方法不管ofNullable()值是否为null,都会执行orElse()的代码,而orElseGet()方法只有在ofNullable()值为null时才会执行传入的函数。

  1. 示例2:
    有如下代码,需要获得Test2中的Info信息,但是参数为Test4,我们要一层层的申请,每一层都获得的对象都可能是空,最后的代码看起来就像这样。
 public String testSimple(Test4 test) {
    if (test == null) {
       return "";
    }
    if (test.getTest3() == null) {
       return "";
    }
    if (test.getTest3().getTest2() == null) {
       return "";
    }
    if (test.getTest3().getTest2().getInfo() == null) {
       return "";
    }
    return test.getTest3().getTest2().getInfo();
}

但是使用Optional后,整个就都不一样了。

    public String testOptional(Test test) {
       return Optional.ofNullable(test)
           .flatMap(Test::getTest3)
           .flatMap(Test3::getTest2)
           .map(Test2::getInfo)
           .orElse("");
    }
  1. 示例3:
Optional.ofNullable(user).ifPresent(o -> o.setUsername("李四"));

如果user不为null,执行ifPresent()方法,否则不执行ifPresent()方法,这与orElseGet()用法刚好相反。

  1. 示例4:
    .查询用户信息,如果没有则新建用户,并将新建的用户信息返回
    User user = Optional.ofNullable(
        baseMapper.selectOne(
            new QueryWrapper<User>()
                .lambda()
                .eq(User::getAlipayUserId, result.getUserId())
                .eq(User::getDelFlag, false)
    )).orElseGet(()-> {
      User newUser = User.builder()
          .relation(User.Relation.Unrelated)
          .authentication(false)
          .status(User.Status.Normal)
          .updateUserId(User.DEFAULT_USER_ID)
          .createUserId(User.DEFAULT_USER_ID)
          .roles(User.ROLE_USER_INFO)
          .alipayUserId(alipayUserId)
          .build();
      this.save(newUser);
      return newUser;
    });

  1. 示:5:
Optional.ofNullable(
        baseMapper.selectOne(new QueryWrapper<User>().lambda().eq(User::getMobileNumber, phone))
    ).filter(user -> {
      if (StringUtils.isNotBlank(user.getAlipayUserId()) && user.getAlipayUserId().equals(userId)) {
        return true;
      }
      baseMapper.physicalDeleteByUserId(userId);
      baseMapper.update(new User(),
          new UpdateWrapper<User>().lambda()
              .set(User::getAlipayUserId, userId)
              .set(User::getUpdateTime, LocalDateTime.now())
              .eq(User::getMobileNumber, phone));
      return true;
    }).orElseGet(() -> {
      baseMapper.update(new User(),
          new UpdateWrapper<User>().lambda()
              .set(User::getMobileNumber, phone)
              .set(User::getUpdateTime, LocalDateTime.now())
              .eq(User::getAlipayUserId, userId));
      return null;
});

filter()方法的用法:只有Optional.ofNullable()不为空时,才会执行filter()方法,否则会直接执行orElseGet()方法。当执行filter()方法时,如果方法内返回true,则直接将Optional.ofNullable()的对象返回,如果方法内返回false,则继续执行orElseGet()方法。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐