欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Optional详解

程序员文章站 2022-03-04 11:49:26
...

Optional是什么
Optional是java8 util包里类
用来避免使用if(aa == null) {} 这样结构的代码的
guava里也有 我们的原则java内置的包优先第三方的依赖

这个类里有几个方法 都是干什么的
这里只说需要掌握的 剩下的几个不会对优化代码有好处

  1. ifPresent
这个Optional里这个对象不是null就会执行ifPresent( 里的内容 )  不会有任何异常
很好用 不用写 !=null 

 String a = "test";
 Optional.ofNullable(a).ifPresent(t->System.out.println("a不是null,我才会执行"));

Optional.of(传入null就抛异常)
Optional.ofNullable(传啥都不会报异常)
Optional.empty() = new Optional

  1. filter 就是相当于一个if的过滤条件
Person p = new Person();
p.setName("小红");Optional.ofNullable(p)
.filter(t->"小明明明".equals(t.getName()))
.ifPresent(t2->System.out.println("filter 里是true的话我才能执行到"));
  1. orElse orElseGet 两个作用一样 都是在为null的时候可以给一个默认值
    区别是后者是个() -> {} 前者是个对象
  Person p = null;
  String x = "test";
  Person p1 = Optional.ofNullable(p).orElse(new Person());
  Person p2 = Optional.ofNullable(p).orElseGet(()->{
      System.out.println(x);
      return new Person();
  });
  1. orElseThrow 如果为null就抛出异常
    try{
        Optional.ofNullable(null).orElseThrow(()->new RuntimeException("我是异常,需要捕获"));
    }catch (Exception e) {
        e.printStackTrace();
    }
  1. map flatMap 两个都是可以访问对象里的内容 t->{ } t是对象
    不同点是 返回结果不一样 前者返回的是一个新的对象 后者返回的是一个新的Optional对象
      User user = new User();
      Address address = new Address();
      House house = new House();
      house.setName("房子的名字");
      address.setHouse(house);
      user.setAddress(address);
      Optional<User> userOptional = Optional.ofNullable(user);
  
  String name = userOptional
              .map(u->u.getAddress())
              .map(address1 -> address1.getHouse())
              .map(house1 -> house1.getName())
              .orElse("defff");
      System.out.println(name); 
    
  String name1 = userOptional
              .flatMap(u->Optional.ofNullable(u.getAddress()))
              .flatMap(address1 -> Optional.ofNullable(address1.getHouse()))
              .flatMap(house1 -> Optional.ofNullable(house1.getName())).orElse("default");
      System.out.println(name1);

map 和 flatmap 还有很多更好的用法 欢迎各位留言区分享

相关标签: JAVA java