Java8新特性Optional常用方法
作者:Mine4everYoung
前言
optional 是Java8 util包中的类,我们为了避免空指针异常(NullPointerException),经常要写好多类似if(a!=null){...},optional就是为了解决这些问题,让代码看起来更nb。
(一)Optional.ofNullable(e).ifPresent()
此方法是当传入的对象为不为空(e!=null)时,才会执行ifPresent()中的代码,e==null时什么都不会执行,也不会抛异常。
//空对象 不会执行
Optional.ofNullable(null).ifPresent(e -> {
System.out.println("空");
});
//空字符串时会执行
Optional.ofNullable("").ifPresent(e -> {
System.out.println("空字符串");
});
//空格 也会执行
Optional.ofNullable(" ").ifPresent(e -> {
System.out.println("空格");
});输出:
空字符串
空格
(二)Optional.ofNullable(e).orElse()
orElse()方法,当 Optional 中有值则将其返回,为空时返回 orElse 方法传入的参数。
此方法可以替代三目运算符使用。
//为空时返回orElse中的值
System.out.println(Optional.ofNullable(null).orElse("默认值"));
//输出 默认值
//不为空时
System.out.println(Optional.ofNullable("我不是空").orElse("默认值"));
//输出 我不是空(三)Optional.ofNullable(e).orElseGet()
orElseGet方法,当Optional 中值为空时,orElseGet与orElse效果是一样的。当Optional 中有值时,两者才有区别,上代码。
//当参数为空时
String a = (String) Optional.ofNullable(null).orElse(get("a"));
System.out.println("a="+a);
String b = (String) Optional.ofNullable(null).orElseGet(() -> get("b"));
System.out.println("b="+b);
输出
a:我执行了
a=a
b:我执行了
b=b
//参数不为空是
String c = Optional.ofNullable("notnull").orElse(get("c"));
System.out.println("c="+c);
String d = Optional.ofNullable("我不是空").orElseGet(() -> get("d"));
System.out.println("d="+d);
输出
c:我执行了
c=notnull
(此处没有 执行)
d=我不是空
private static String get(String s) {
System.out.println(s + ":我执行了");
return s;
}可以看到,当参数不为空时,orElseGet中的方法是没有执行的。
(四)Optional.ofNullable(e).filter()
filter个方法通过传入的定条件对Optional实例的值进行过滤,它可以配合着.ifPresent()方法和.orElse()使用
Optional.ofNullable("notnull").filter(t -> "notnull".equals(t)).ifPresent(t2 -> System.out.println("成立时我才会执行"));
输出
成立时我才会执行
String a=Optional.ofNullable("notnull").filter(t -> "null".equals(t)).orElse(("不成立时我才会执行"));
System.out.println("a="+a);
String b=Optional.ofNullable("notnull").filter(t -> "notnull".equals(t)).orElse(("不成立时我才会执行"));
System.out.println("b="+b);
输出
a=不成立时我才会执行
b=notnull补充:Optional的用法代码案例
示例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()方法。
总结
到此这篇关于Java8新特性Optional常用方法的文章就介绍到这了,更多相关Optional常用方法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
