java.lang.NullPointerException
相信对每一个java程序员来说都不陌生的,常常因为缺少一个判空导致系统各自通讯错误,异常。从java8开始,给我们提供了一个对象判空操作处理类Optional。
根据jdk8官方文档,可以知道,该根据类存在于java.util下的final类,也就是说是官方提供给我们的一个工具类。
当然首先我们来看下具体的使用方法:
Optional<String> optionalS = Optional.of(new String("baomw"));
System.out.println(optionalS.get());
如上,代码非常简单:效果如下
核心api说明如下:
方法 描述
api | 说明 |
---|---|
of | 把指定的值封装为Optional对象,如果指定的值为null,则抛出NullPointerException |
ofNullable | 把指定的值封装为Optional对象,如果指定的值为null,则创建一个空的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对象 |
/**
* Common instance for {@code empty()}.
*/
private static final Optional<?> EMPTY = new Optional<>();
/**
* Returns an {@code Optional} with the specified present non-null value.
*
* @param <T> the class of the value
* @param value the value to be present, which must be non-null
* @return an {@code Optional} with the value present
* @throws NullPointerException if value is null
*/
public static <T> Optional<T> of(T value) {
return new Optional<>(value);
}
/**
* Returns an {@code Optional} describing the specified value, if non-null,
* otherwise returns an empty {@code Optional}.
*
* @param <T> the class of the value
* @param value the possibly-null value to describe
* @return an {@code Optional} with a present value if the specified value
* is non-null, otherwise an empty {@code Optional}
*/
public static <T> Optional<T> ofNullable(T value) {
return value == null ? empty() : of(value);
}
/**
* If a value is present in this {@code Optional}, returns the value,
* otherwise throws {@code NoSuchElementException}.
*
* @return the non-null value held by this {@code Optional}
* @throws NoSuchElementException if there is no value present
*
* @see Optional#isPresent()
*/
public T get() {
if (value == null) {
throw new NoSuchElementException("No value present");
}
return value;
}
/**
* Return {@code true} if there is a value present, otherwise {@code false}.
*
* @return {@code true} if there is a value present, otherwise {@code false}
*/
public boolean isPresent() {
return value != null;
}
核心api及关键点如上,注意比较of 和ofNullable经常会有出现使用Optional.of创建Optional对象时报空指针,因为(如下)是of创建Optional对象的构造方法,发现如果传入的value为null时,会抛出一个空指针异常。
private Optional(T value) {
this.value = Objects.requireNonNull(value);
}
public static <T> T requireNonNull(T obj) {
if (obj == null)
throw new NullPointerException();
return obj;
}
而对于ofNullable上述源码可以看出,有一个三目表达式,如果value为空,则创建一个空的Optional对象。
public static <T> Optional<T> ofNullable(T value) {
return value == null ? empty() : of(value);
}
如上可以根据实际需要适当选取构造方法。
经常在代码中会有这样的写法,如果值为空就给个默认值的情况:
if(str == null){
return new String("baomw");
}else{
return str;
}
当然如果用Optional.orElse(method)就使得这样子的写法异常简单。
return Optional.ofNullable(str).orElse(new String("baomw"));
使用orElse方法,就很好的解决了,如果值不为空则返回,否则执行orElse里面的方法并返回其返回值。
关于更多其他api的详细用法,有兴趣的可以自己试一下。