Optional的用法-代码案例
前言Optional是一个容器对象,用来判断对象是否为null,记住,只会判断是否为null,代替的 if else 的写法。废话不多说,下面就来看看一下写法吧。代码示例1:String s = Optional.ofNullable(user).map(o -> o.getUsername()).orElseGet(() -> { return "李四";});用法说明:Option
前言
Optional是一个容器对象,用来判断对象是否为null,记住,只会判断是否为null,代替的 if else 的写法。废话不多说,下面就来看看一下写法吧。
代码
- 示例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时才会执行传入的函数。
- 示例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("");
}
- 示例3:
Optional.ofNullable(user).ifPresent(o -> o.setUsername("李四"));
如果user不为null,执行ifPresent()方法,否则不执行ifPresent()方法,这与orElseGet()用法刚好相反。
- 示例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;
});
- 示: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()方法。
更多推荐
所有评论(0)