Optional总结
建议:使用ofNullable() 避免空指针, orElse()与orElseGet() 根据出入的值来判断,如果是传入的一个已知的值(变量)则可用orElse(),如果传入的是一个方法则使用orElseGet()
2:利用Optional避免多次if else判断【switch效率不高,策略strategy模式复杂,】:
对象层层嵌套,为了逻辑严谨必须要进行空判断,如果不层层判断,有可能在某一层上收获一个空指针,而Optional优雅的帮我们处理掉这样的逻辑。
原文链接:blog.csdn.net/weixin_4198…
1:避免if else 判断利用策略模式:
- Optional的orElseGet()的参数是一个函数式接口,只有在条件为null时才会执行orElseGet()里的方法,这是跟orElse()最大的区别,用orElseGet()性能会更好。
- Optional.ofNullable(selectStartTime()) #级联判断对象为空
- list为空map为空,
- filter()方法大致意思是,接受一个对象,然后对他进行条件过滤,如果条件符合则返回Optional对象本身,如果不符合则返回空Optional
- 不等于空时执行: Optional.ofNullable(user).ifPresent(u->dosomething(u));
- orElseGet与orElse区别在于得到的默认值。用orElseGet()性能会更好。
orElse方法将传入的字符串作为默认值【也可以Object】,orElseGet方法可以接受Supplier接口生成默认值
Optional<Object> o1 = Optional.ofNullable(null);
System.out.println(o1.orElseGet(() -> "default value"));
Optional.ofNullable(shop).orElseGet(()->createNew());
Optional.ofNullable(shop).orElse(createNew());
User user = Optional
.ofNullable(getUserById(id))
.orElse(new User(0, "Unknown"));
- flatMap 方法与 map 方法的区别在于,map 方法参数中的函数 mapper 输出的是值,然后 map 方法会使用 Optional.ofNullable 将其包装为 Optional;而 flatMap 要求参数中的函数 mapper 输出的就是 Optional。 【flatMap 的返回值必须是Optional,而map的返回值任意类型T】
Optional<String> username = Optional
.ofNullable(getUserById(id))
.flatMap(user -> Optional.of(user.getUsername()))
.flatMap(name -> Optional.of(name.toLowerCase()));
#java 判空
private String getStartTime() {
LocalDateTime dateTime = selectStartTime();
if (dateTime == null) {
return "2020-01-01 00:00:00";
}
return dateTimeToString(dateTime);
}
private LocalDateTime selectStartTime(){
//去DB查找业务需要的LocalDateTime值
}
protected String dateTimeToString(LocalDateTime dateTime) {
if (dateTime == null) {
return null;
}
return DateTimeFormatter.ofPattern(Constants.DEFAULT_DATE_TIME_FORMAT).format(dateTime);
}
#精简后:
private String getStartTime() {
return Optional.ofNullable(selectStartTime()).map(e->
dateTimeToString(e)).orElseGet(()->"2020-01-01 00:00:00");
}
示例2:
User user = Optional.ofNullable(getCacheUser(1)).orElseGet(() -> selectUserById(1));
替代:
User user = getCacheUser(1);
if (user == null) {
user = selectUserById(1);
}
#OPtional 写法一:
Object df = Optional.of(t1).map((Function<test16, Object>)
test16 -> test16.getOrderName().toLowerCase())
.orElse("df");
return df.toString();
OPtional 写法二:
String elseThrow = Optional.ofNullable(t1).map(x -> x.getOrderName())
.map(x -> x.toLowerCase())
.orElseThrow(new Supplier<Throwable>() {
@Override
public Throwable get() {
return new Throwable("t1为空");
}
https://blog.csdn.net/XikYu/article/details/127814603
#Option 的filter操作
public User getUser(User user) {
return Optional.ofNullable(user)
.filter(u->"zhangsan".equals(u.getName()))
.orElseGet(()-> {
return new User("zhangsan");
});
}
Jdk 9对Optional优化
首先增加了三个方法: or()、ifPresentOrElse() 和 stream()。
- or() 与orElse等方法相似,如果对象不为空返回对象,如果为空则返回or()方法中预设的值。*
- ifPresentOrElse() 方法有两个参数:一个 Consumer 和一个 Runnable。如果对象不为空,会执行 Consumer 的动作,否则运行 Runnable。相比ifPresent()多了OrElse判断。
- stream()将Optional转换成stream,如果有值就返回包含值的stream,如果没值,就返回空的stream。