java 解决空指针的方案-optional

在java的编码中我们会经常遇到空指针的情况,为了解决空指针问题,我们经常需要使用if进行判断处理,我们代码中应该是我们的业务代码,而不是大量的对于空指针的校验代码。为了解决这个问题,在jdk 8 的版本中,官方为我们提供了Optional这个类的用来解决空指针的问题。

Optional 方法学习

Optional 有一个私有的final属性 value用来保存需要进行判断的实例对象。

构造方法

有一个无参构造方法,和一个有参构造方法,两个构造方法都是私有的,提供了静态方法来获得实例对象。

empty 方法

用来获取一个默认的,value为空的实例对象

1
2
3
4
5
6
7
8

private static final Optional<?> EMPTY = new Optional<>();

public static<T> Optional<T> empty() {
@SuppressWarnings("unchecked")
Optional<T> t = (Optional<T>) EMPTY;
return t;
}

of 方法

这个方法没做其他工作,就是调用了有参构造方法,感觉主要是内部使用,我们工作中调用不多

1
2
3
public static <T> Optional<T> of(T value) {
return new Optional<>(value);
}

ofNullable 方法

如果传入的是一个null对象,就返回默认的空实例对象,否则就调用上面的of方法。我们主要调用这个

1
2
3
public static <T> Optional<T> ofNullable(T value) {
return value == null ? empty() : of(value);
}

常用方法

get

用来获取我们传入的实例对象,如果是一个null,会抛出异常。

isPresent

判断我们传入的是否是一个null

ifPresent

需要传入一个Consumer对象,如果value是null就会调用Consumeraccept方法。我们主要会使用该方法

orElse

我们经常会有这样的业务,如果是null,我们需要给一个默认值,这个时候我们就可以使用该方法,这个方法支持传入一个默认值,如果value是空的,就会返回我们传入的默认值。

1
2
3
public T orElse(T other) {
return value != null ? value : other;
}

还有 map,filter 等方法

使用场景

我们定义一个Person类,用户演示代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
static class Person {

private String name;

public Person(){

}

public Person(String name) {
this.name = name;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}
}

获取姓名

用户修改显示的名字,从前段传入到后台,我们使用变量保存传入的值。假设用户没有设置值,后台处理的伪代码如下:

1
2
3
4
5
6
7
8
String name = null;//前段传入的值
//非空的判断
if(name==null){
name = "请设置您的用户名";
}

//Optional 代码
name = Optional.ofNullable(name).orElse("请设置您的用户名");

获取姓名2

我们使用Person对象来接收前段传入的姓名,这里我们认为Person的实例对象不为空

1
2
3
4
5
6
Person p = new Person();

p = Optional.ofNullable(p).map(p->{
p.setName("zhangsan");
return p;
}).get();