Java8 Optional用法
Java8新加了一个Optional类,根据文档注释看,这是一个处理null值和non-null值的类,使用这个类,不要再担心出现NPE的问题。
可以把它当作一个工具类使用,不能继承。
三个静态方法:
-
static <T> Optional<T> empty()
返回一个空的Optional。 -
static <T> Optional<T> of(T value)
value不能为null。 -
static <T> Optional<T> ofNullable(T value)
value为null则返回一个空的Optional。
一般来说,都会使用ofNullable()方法。
实例方法:
-
boolean equals(Object obj)
虽然接受Object,但下面这样并不相等Integer a = 3; boolean equals = Optional.ofNullable(a).equals(3);
因为equals中这样判断
if (!(obj instanceof Optional)) { return false; }
-
Optional<T> filter(Predicate<? super T> predicate)
接受一个函数式接口Predicate,这个接口接受一个参数,返回boolean类型,根据名字可知,就是一个过滤器,符合条件就返回包含指定值的Optional,不符合就返回空的Optional。Integer a = 3; Optional.ofNullable(a) .filter(b -> b == 3) .ifPresent(System.out::println);
-
<U> Optional<U> flatMap(Function<? super T,Optional<U>> mapper)
还是接受一个函数式接口Function,这个接口接收参数,返回一个结果,这里返回一个Optional。Integer a = 3; Optional.ofNullable(a) .flatMap((b -> { int sum = 1 + 2 + b; return Optional.ofNullable(sum); }));
-
T get()
小心使用,如果值存在则返回,如果值不存在,则抛异常NoSuchElementException.
-
void ifPresent(Consumer<? super T> consumer)
接受一个函数式接口Consumer,当值存在时,处理当前值,不存在,跳过。 -
void ifPresentOrElse(Consumer<? super T> action, Runnable emptyAction)
如果存在就执行Cousumer.accept(),不存在就执行Runnable run();Integer a = null; Optional.ofNullable(a) .ifPresentOrElse(b -> { System.out.println(b); }, () -> { System.out.println("empty"); });
-
boolean isPresent();
判断值是否存在,存在为true,否则为false。 -
<U> Optional<U> map(Function<? super T,? extends U> mapper)
这个和flatMap相似,只是这个返回结果的类型不固定。Optional.ofNullable(a) .flatMap((b -> { int sum = 1 + 2 + b; return Optional.ofNullable(sum); })) .map(c -> String.valueOf(c)) .ifPresent(System.out::println);
-
T orElse(T other)
如果值存在就返回,如果值不存在就返回otherInteger a = null; Optional.ofNullable(a) .orElse(10);
-
T orElseGet(Supplier<? extends T> other)
接受一个函数式接口Supplier,如果值存在就返回,不存在就抛异常。行Supplier的get方法。这个和orElse()的区别就是可以执行方法,orElse()只能返回固定值。 -
T orElseThrow()
如果值存在就返回,不存在就抛异常NoSuchElementException
-
<X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier)
如果值存在就返回,不存在就抛异常。此异常由Supplier.get()返回,算是可以自定义异常。
这个类可以用到方法返回值中,比如dto,service层的返回值,直接返回Optional.ofNullable(value)
就好了。调用方接收返回值,也不用再写if(xxx == null)
或者if(xxx != null)
了。直接
returnVal.ifPresent( val -> {
})
就相当于
if(xxx != null){
}
这样
returnVal.ifPresentOrElse(val -> {
System.out.println(val);
}, () -> {
System.out.println("empty");
});
就相当于
if(returnVal == null){
System.out.println(returnVal);
}else{
System.out.println("empty");
}
上一篇: Boost.Optional的用法
下一篇: Java 8 Optional 详细用法