Optional详解
程序员文章站
2022-03-04 11:49:26
...
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,我才会执行"));
Optional.of(传入null就抛异常)
Optional.ofNullable(传啥都不会报异常)
Optional.empty() = new Optional
- filter 就是相当于一个if的过滤条件
Person p = new Person();
p.setName("小红");Optional.ofNullable(p)
.filter(t->"小明明明".equals(t.getName()))
.ifPresent(t2->System.out.println("filter 里是true的话我才能执行到"));
- 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 还有很多更好的用法 欢迎各位留言区分享