Optional<T>
是Java8增加的一个用于处理NullPointException
异常的类。Optional<T>
是一个容器类,代表一个值存在或不存在。如果用过Spring Boot Data Jpa,会发现里面好多返回值都是Optional<T>
类型的。
下面我们介绍一下Optional<T>
类的常见使用方法。
作为演示,我们创建了一个Dish
类,代码如下:
public class Dish {
/**
* 构造函数
* @param name 名称
* @param isVegetarian 是否蔬菜
*/
public Dish(String name, boolean isVegetarian) {
this.name = name;
this.isVegetarian = isVegetarian;
}
/**
* 名称
*/
private String name;
/**
* 是否蔬菜
*/
private boolean isVegetarian;
@Override
public String toString(){
return name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public boolean isVegetarian() {
return isVegetarian;
}
public void setVegetarian(boolean isVegetarian) {
this.isVegetarian = isVegetarian;
}
}
创建一个Optional<T>
实例
创建Optional<T>
实例,有两个方法,分别是of
、ofNullable
,ofNullable
与是of
的区别在于,如果传递的参数是null
,那么会创建一个空的(empty
)Optional<T>
实例。
Optional<Dish> dishOptionalofNullable = Optional.ofNullable(null);
dishOptionalofNullable.ifPresent(System.out::println);
System.out.println("准备输出of方法的值");
Optional<Dish> dishOptionalof = Optional.of(null);
dishOptionalof.ifPresent(System.out::println);
运行代码,我们可以看到如下输出
我们可以看到ofNullable
创建的实例,即使传递的参数是null
调用实例方法时,系统也会抛出异常,而of
传递null
值时,创建的Optional<T>
实例也是null
。
判断是否为空
通过isPresent()
方法可以判断Optional<T>
包含的类是否是null
。返回true
代表不是null
,返回false
代表是null
。
Optional<Dish> emptyOptional = Optional.empty();
if (emptyOptional.isPresent()) {
System.out.println(emptyOptional.get());
} else {
System.out.println("empty optional");
}
还有一个方法是ifPresent(Consumer<? super T> action)
可以传递一个Consumer
接口,当类不是null
。
Optional<Dish> emptyOptional = Optional.empty();
emptyOptional.ifPresent(System.out::println);
还有一个方法 ifPresentOrElse(Consumer<? super T> action, Runnable emptyAction)
,当类不是null
时,调用action
接口,否则调用emptyAction
接口。
List<Dish> menu = new ArrayList<>();
Dish fish = new Dish("鱼", false);
Dish tomato = new Dish("西红柿", true);
menu.add(fish);
menu.add(tomato);
menu.stream().filter(Dish::isVegetarian).findAny().ifPresentOrElse(System.out::println, () -> {
System.out.println("没找到呢");
});
获取值
获取值比较简单,通过get()
方法即可。
Optional<Dish> fishOptional = Optional.ofNullable(new Dish("鱼", false));
if(fishOptional.isPresent()){
System.out.println(fishOptional.get());
}
通过orElse(T other)
可以设置默认值。
Optional<Dish> fishOptional = Optional.ofNullable(new Dish("鱼", false));
Dish defaultDish = new Dish("default", false);
if (fishOptional.isPresent()) {
System.out.println(fishOptional.orElse(defaultDish));
}
Optional<Dish> emptyOptional = Optional.empty();
System.out.println(emptyOptional.orElse(defaultDish));
上面emptyOptional
是空的,那么我们可以返回一个默认的Dish
实例,下面看下控制台输出。orElse(T other)
还有一些变种方法,大家可以试一下。
评论 (0)