转载

Optional详解

Optional是什么?

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

这个类里有几个方法 都是干什么的

这里只说需要掌握的 剩下的几个不会对优化代码有好处

ifPresent

这个Optional里这个对象不是null就会执行ifPresent( 里的内容 ) 不会有任何异常 很好用 不用写 !=null
String a = "test";
 Optional.ofNullable(a).ifPresent(t->System.out.println("a不是null,我才会执行"));

ofNullable和 of

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

filter 就是相当于一个if的过滤条件

 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();
 });

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();
 });

orElseThrow 如果为null就抛出异常

 try{
 Optional.ofNullable(null).orElseThrow(()->new RuntimeException("我是异常,需要捕获"));
 }catch (Exception e) {
 e.printStackTrace();
 }

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 还有很多更好的用法 欢迎各位留言区分享

————————————————

原文链接:https://blog.csdn.net/giscong/article/details/107658727
正文到此结束
Loading...