目录
一、相关方法
1、of(T value) 入参必须保证不为null
2、ofNullable(T value) 不确定入参是否为null
3、empty() ,不包含任何入参
4、isPresent()
5、orElse(T other)
6、map(Function mapper)
二、总结
一、相关方法
根据官方的说明,Java8推出的Optional 的目的是为了杜绝空指针异常,从而帮助开发者开发出更加优雅的代码。它是一个容器对象,可以包含,也可以不包含非null值。在Java 8 之前,程序员会明确返回null, 现在是Optional。这种变化区别就在于,返回Optional 是明确的声明,返回值中可能没有东西。并且Optional 中有近10种方法,供我们使用和创建Optional类。
诚然,官方提供了相关API以及3个静态的方法(以便我们能获取一个Optional):
1、of(T value) 入参必须保证不为null
/**
* 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);
}
官方的说明很简单,该方式会返回一个具有当前值(即入参中的value)的 Optional,前提是保证入参不能为null,否则会报空指针异常。
2、ofNullable(T value) 不确定入参是否为null
/**
* 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);
}
从注释中可以看到,和上面的方法相比,这个方法允许入参为null,它并不会抛出异常。反过来,如果我传入一个null,则会得到:Optional.empty()。
3、empty() ,不包含任何入参
/**
* Returns an empty {@code Optional} instance. No value is present for this
* Optional.
*
* @apiNote Though it may be tempting to do so, avoid testing if an object
* is empty by comparing with {@code ==} against instances returned by
* {@code Option.empty()}. There is no guarantee that it is a singleton.
* Instead, use {@link #isPresent()}.
*
* @param <T> Type of the non-existent value
* @return an empty {@code Optional}
*/
public static<T> Optional<T> empty() {
@SuppressWarnings("unchecked")
Optional<T> t = (Optional<T>) EMPTY;
return t;
}
该方法直接返回一个空的optional,即该Optional 中不包含值。
4、isPresent()
/**
* 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;
}
这个方法翻译过来就是:如果存在值,则返回 true,否则返回 false。
5、orElse(T other)
/**
* Return the value if present, otherwise return {@code other}.
*
* @param other the value to be returned if there is no value present, may
* be null
* @return the value, if present, otherwise {@code other}
*/
public T orElse(T other) {
return value != null ? value : other;
}
这个方法表示,如果存在(即,Optional 中有值)就将其返回,不存在就返回传入值。
6、map(Function<? super T, ? extends U> mapper)
/**
* If a value is present, apply the provided mapping function to it,
* and if the result is non-null, return an {@code Optional} describing the
* result. Otherwise return an empty {@code Optional}.
*
* @apiNote This method supports post-processing on optional values, without
* the need to explicitly check for a return status. For example, the
* following code traverses a stream of file names, selects one that has
* not yet been processed, and then opens that file, returning an
* {@code Optional<FileInputStream>}:
*
* <pre>{@code
* Optional<FileInputStream> fis =
* names.stream().filter(name -> !isProcessedYet(name))
* .findFirst()
* .map(name -> new FileInputStream(name));
* }</pre>
*
* Here, {@code findFirst} returns an {@code Optional<String>}, and then
* {@code map} returns an {@code Optional<FileInputStream>} for the desired
* file if one exists.
*
* @param <U> The type of the result of the mapping function
* @param mapper a mapping function to apply to the value, if present
* @return an {@code Optional} describing the result of applying a mapping
* function to the value of this {@code Optional}, if a value is present,
* otherwise an empty {@code Optional}
* @throws NullPointerException if the mapping function is null
*/
public<U> Optional<U> map(Function<? super T, ? extends U> mapper) {
Objects.requireNonNull(mapper);
if (!isPresent())
return empty();
else {
return Optional.ofNullable(mapper.apply(value));
}
}
这个方法的注释好长啊,其实用一句话总结就是:逐层拆解value,解决NPE。文后会附上关于这一块讲的笔记好的博文链接,大家感兴趣可以去研究下窝。
二、总结
引用官方的说明,来总结下Optional:
Optional对象是一种包装器对象,被当作一种更安全的方式,用来替代类型T的引用,用以解决空指值异常所带来的问题。
附上前文提到的关于这块写的比较好的一篇博文:
Java8 Optional - 知乎烦人的空指针请大家赏析下面这段代码: public class NullPointerTest { /** * 需求:根据用户名查找该用户所在的部门名称 * * @param args */ public static void main(String[] args) { String departmentNameOf…https://zhuanlan.zhihu.com/p/338128121 文章来源:https://www.toymoban.com/news/detail-679326.html
谢谢大家!文章来源地址https://www.toymoban.com/news/detail-679326.html
到了这里,关于初识Optional.ofNullable()方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!