为了解决空指针异常,Google 公司著名的 Guava 项目引入了 Optional 类,来检查空值
Optional <T> 类是一个容器类,它可以保存类型 T 的值,代表这个值存在,或仅仅保存 null,表示这个值不存在
目录
Optional类的方法
Optional.empty() | 创建一个空的 Optional 实例 |
Optional.of(T t) | 创建一个 Optional 实例,当 t为null时抛出异常 |
Optional.ofNullable(T t) | 创建一个 Optional 实例,但当 t为null时不会抛出异常,而是返回一个空的实例 |
get() | 获取optional实例中的对象,当optional 容器为空时报错 |
isPresent() | 判断optional是否为空,如果空则返回false,否则返回true |
ifPresent(Consumer c) | 如果optional不为空,则将optional中的对象传给Comsumer函数 |
orElse(T other) | 如果optional不为空,则返回optional中的对象;如果为null,则返回 other 这个默认值 |
orElseGet(Supplier<T> other) | 如果optional不为空,则返回optional中的对象;如果为null,则使用Supplier函数生成默认值other |
orElseThrow(Supplier<X> exception) | 如果optional不为空,则返回optional中的对象;如果为null,则抛出Supplier函数生成的异常 |
代码举例
import org.junit.Test;
import java.util.Optional;
public class OptionalTest {
@Test
public void test(){
Girl girl = new Girl();
girl = null;
Optional<Girl> optionalGirl = Optional.ofNullable(girl);
Girl girl1 = optionalGirl.orElse(new Girl("小红"));
//如果为 Girl 为 null,则返回Optional.empty,不为 null 则返回小红
System.out.println(optionalGirl);
}
}
class Girl{
private String name;
public Girl(){}
public Girl(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Girl{" +
"name='" + name + '\'' +
'}';
}
}
class Boy{
private Girl girl;
public Boy(Girl girl) {
this.girl = girl;
}
public Girl getGirl() {
return girl;
}
public void setGirl(Girl girl) {
this.girl = girl;
}
@Override
public String toString() {
return "Boy{" +
"girl=" + girl +
'}';
}
}
>>> Optional.empty