Java8新特性系列(Optional)
背景
只要是Java程序员,都应该遇到过空指针异常:NullPointerException
,简称NPE
。
在Java8之前,我们都要判断下对象是否为null,或者用Google
提供的Guava
的Optional
在Java8中,提供了Optional
使用
- 属性
/**
* Common instance for {@code empty()}.一个空的实例
*/
private static final Optional<?> EMPTY = new Optional<>();
/**
* If non-null, the value; if null, indicates no value is present
非空则就是这个值,如果空则指示这个值不存在
*/
private final T value;
- Constructs
/**
* Constructs an empty instance.
*构造一个value为null的空实例
* @implNote Generally only one empty instance, {@link Optional#EMPTY},
* should exist per VM.
*/
private Optional() {
this.value = null;
}
/**
* Constructs an instance with the value present.
构造一个value存在的实例
* @param value the non-null value to be present
* @throws NullPointerException if value is null
如果value为空则报空指针异常
*/
private Optional(T value) {
this.value = Objects.requireNonNull(value);
}
- init
- empty 构造一个空对象 //一个空的实例
- of 不能传null
- ofNullable 可以为null
public static<T> Optional<T> empty() {
@SuppressWarnings("unchecked")
Optional<T> t = (Optional<T>) EMPTY;
return t;
}
// of(T value)value值为空则报控制值异常--><>使用?
public static <T> Optional<T> of(T value) {
return new Optional<>(value);
}
//value为空则返回value为空的Optional实例对象,否则返回value为空的实例对象
public static <T> Optional<T> ofNullable(T value) {
return value == null ? empty() : of(value);
}
- get
- 如果为null,会抛异常,用isPresent来判断
public T get() {
if (value == null) {
throw new NoSuchElementException("No value present");
}
return value;
}
- isPresent
- 判断元素是否为null
public boolean isPresent() {
return value != null;
}
- ifPresent
- 判断不为null时执行操作,如optional.ifPresent(System.out::println)
public void ifPresent(Consumer<? super T> consumer) {
if (value != null)
consumer.accept(value);
}
- filter
- predicate代表输入
public Optional<T> filter(Predicate<? super T> predicate) {
Objects.requireNonNull(predicate); // 对象不能为空,否则报空指针
if (!isPresent()) //Optional对象中的value为空则返回这个Optional
return this;
else
return predicate.test(value) ? this : empty();//如果过滤符合条件则返回这个Optional 否则返回空的OPtional
}
- map函数所接受的入参类型为Function<? super T, ? extends U>,而flapMap的入参类型为Function<? super T, Optional<U>>。
- map
- 参数mapper代表一个输入和输出
public<U> Optional<U> map(Function<? super T, ? extends U> mapper) {
Objects.requireNonNull(mapper); 对象不能为空,否则报空指针
if (!isPresent()) //Optional对象中的value为空则返重新new 的空的Option对象
return empty();
else {
return Optional.ofNullable(mapper.apply(value));//过滤后输出value ,value为null则返回empty Option,否则返回0f(value)
}
}
- flatMap
public<U> Optional<U> flatMap(Function<? super T, Optional<U>> mapper) {
Objects.requireNonNull(mapper);
if (!isPresent())
return empty();
else {
return Objects.requireNonNull(mapper.apply(value));//输入value不能空null
}
}
- orElse
- 如果为null返回某个默认值,否则返回具体值
public T orElse(T other) {
return value != null ? value : other;
}
- orElseGet 代表输出
public T orElseGet(Supplier<? extends T> other) {
return value != null ? value : other.get();
}
- orElseThrow
public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X {
if (value != null) {
return value;
} else {
throw exceptionSupplier.get();
}
}
总结
Optional有什么用?
- 简化代码
- 类似于Lambda
- 能一定程度避免空指针
- 比如:optional.ifPresent(…)等
- 增加可读性
- 比如:optional.ifPresent(…).orElse(…);是不是比if/else分支更可读呢?
- 转载
【原创】JAVA8之妙用Optional解决NPE问题 – 孤独烟 – 博客园 www.cnblogs.com
原文作者:统吃猫
原文地址: https://zhuanlan.zhihu.com/p/38768194
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
原文地址: https://zhuanlan.zhihu.com/p/38768194
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
相关文章