Java8之Optional
理解
Optional是Java 8的一个新特性,它是一个对象判空的处理类,其出现的目的是可以优雅的解决java.lang.NullPointException,能够避免大量的空值判断。
钻研

具体翻译如下:
这个容器可以包含或者不包含一个非空值。如果这个值存在,isPresent()方法将返回true,get()方法将返回值。
它提供了依赖于包含值的存在与否的其他方法,例如orElse()(如果值不存在,则返回默认值)和ifPresent()(如果值存在,则执行代码块)。
这是一个基于值的类;在Optional的实例上使用对标识敏感的操作(包括引用相等(=)、标识哈希码或同步)可能会产生不可预知的结果,应该避免。
方法
| API | 方法详情 |
| of | 将值封装为Optional对象,如果值为空,则抛出空指针异常 |
| ofNullable | 将值封装为Optional对象,如果值为空,返回一个空的 Optional对象 |
| get | 如果Optional中有值存在,则返回此值,否则抛出NoSuchElementException |
| isPresent | 如果Optional中有值存在,则返回true,否则返回false |
| ifPresent | 如果Optional中有值存在,则执行方法调用,否则什么也不做 |
| orElse | 如果Optional中有值存在,则返回此值,否则返回一个默认值 |
| orElseGet | 如果Optional中有值存在,则返回此值,否则返回一个由Supplier接口生成的值 |
| empty | 创建一个空的Optional对象 |
| orElseThrow | 如果创建的Optional中有值存在,则返回此值,否则抛出一个由指定的Supplier接口生成的异常 |
| filter | 如果创建的Optional中的值满足filter中的条件,则返回包含该值的Optional对象,否则返回一个空的Optional对象 |
| map | 如果创建的Optional中的值存在,对该值执行提供的Function函数调用 |
| flagMap | 如果创建的Optional中的值存在,就对该值执行提供的Function函数调用,返回一个Optional类型的值,否则就返回一个空的Optional对象 |
使用
以前的用法:
public String getCity(User user) throws Exception{
if(user!=null){
if(user.getAddress()!=null){
Address address = user.getAddress();
if(address.getCity()!=null){
return address.getCity();
}
}
}
throw new Excpetion("取值错误");
}
Java8用法:
public String getCity(User user) throws Exception{
return Optional.ofNullable(user)
.map(u-> u.getAddress())
.map(a->a.getCity())
.orElseThrow(()->new Exception("取指错误"));
}
以前的用法:
if(user!=null){
dosomething(user);
}
Java8用法:
Optional.ofNullable(user).ifPresent(u->{
dosomething(u);
});
以前的用法:
public User getUser(User user) throws Exception{
if(user!=null){
String name = user.getName();
if("zhangsan".equals(name)){
return user;
}
}else{
user = new User();
user.setName("zhangsan");
return user;
}
}
Java8用法:
public User getUser(User user) {
return Optional.ofNullable(user)
.filter(u->"zhangsan".equals(u.getName()))
.orElseGet(()-> {
User user1 = new User();
user1.setName("zhangsan");
return user1;
});
}

浙公网安备 33010602011771号