Optional使用技巧-api大全

109 阅读2分钟

Optional总结

建议:使用ofNullable() 避免空指针, orElse()与orElseGet() 根据出入的值来判断,如果是传入的一个已知的值(变量)则可用orElse(),如果传入的是一个方法则使用orElseGet()

2:利用Optional避免多次if else判断【switch效率不高,策略strategy模式复杂,】:

对象层层嵌套,为了逻辑严谨必须要进行空判断,如果不层层判断,有可能在某一层上收获一个空指针,而Optional优雅的帮我们处理掉这样的逻辑。

原文链接:blog.csdn.net/weixin_4198…

1:避免if else 判断利用策略模式:

blog.csdn.net/weixin_4198…

www.cnblogs.com/luoboyu/p/1…

blog.csdn.net/WLQ0621/art…

  • 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");
}


示例2User 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。