Optional静态类简介以及用法

Optional静态类简介以及用法

1、简介

Optional 类是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。

Optional 是个容器:它可以保存类型T的值,或者仅仅保存null。Optional提供很多有用的方法,这样我们就不用显式进行空值检测。

Optional 类的引入很好的解决空指针异常。

2、命令详解

2.1 empty

public static <T> Optional<T> empty()

功能:返回一个空Optional实例。此 Optional 不存在任何值。

  • API注意事项:

尽管这样做可能很诱人,但请避免通过与==返回的实例 进行比较来测试对象是否为空Option.empty()。不能保证它是单例。相反,使用isPresent().

  • 类型参数:

T - 不存在值的类型

  • 返回:
  • 一个空的 Optional

2.2 of

public static <T> Optional<T> of(T value)

功能:返回Optional具有指定当前非空值的 。

  • 类型参数:

T - 值的类别

  • 参数:

value - 要存在的值,必须为非空

  • 返回:

一个Optional与存在的值

  • 抛出:

NullPointerException - 如果值为空

2.3 ofNullable

public static <T> Optional<T> ofNullable(T value)

功能:返回Optional描述指定的值,如果非空,否则返回空Optional

  • 类型参数:

T - 值的类别

  • 参数:

value - 要描述的可能为空的值

  • 返回:

一个Optional与本值,如果指定的值非空,否则一个空Optional

2.4 get

public T get()

功能:如果 this 中存在一个值Optional,则返回该值,否则抛出NoSuchElementException

  • 返回:

this 持有的非空值 Optional

  • 抛出:

NoSuchElementException - 如果没有价值存在

2.5 isPresent

public boolean isPresent()

功能:true如果存在值则返回,否则返回false

  • 返回:

true 如果存在一个值,否则 false

2.6 ifPresent

public void ifPresent(Consumer<? super T> consumer)

功能:如果存在值,则使用该值调用指定的使用者,否则不执行任何操作。

  • 参数:

consumer - 如果存在值则执行块

  • 抛出:

NullPointerException- 如果值存在并且consumer为空

2.7 filter

public Optional<T> filter(Predicate<? super T> predicate)

功能:如果存在一个值,并且该值与给定的谓词匹配,则返回一个Optional描述该值的值,否则返回一个空值Optional

  • 参数:

predicate - 应用于该值的谓词(如果存在)

  • 返回:

一个Optional描述此值Optional 一个值是否存在,并且值给定的谓词相匹配,否则一个空Optional

  • 抛出:

NullPointerException - 如果谓词为空

2.8 map

public <U> Optional<U> map(Function<? super T,? extends U> mapper)

功能:如果存在一个值,则对其应用提供的映射函数,如果结果为非空,则返回一个Optional描述结果的值。否则返回一个空的Optional

  • API注意事项:

此方法支持对可选值进行后处理,而无需显式检查返回状态。例如,以下代码遍历文件名流,选择尚未处理的文件名,然后打开该文件,返回 Optional<FileInputStream>Optional<FileInputStream> fis = names.stream().filter(name -> !isProcessedYet(name)) .findFirst() .map(name -> new FileInputStream(name));在这里,findFirst返回一个Optional<String>,然后 map返回Optional<FileInputStream>所需文件的一个(如果存在)。

  • 类型参数:

U - 映射函数结果的类型

  • 参数:

mapper - 应用于该值的映射函数(如果存在)

  • 返回:

anOptional描述将映射函数应用于 this 的值的结果Optional,如果存在值,否则为空Optional

  • 抛出:

NullPointerException - 如果映射函数为空

2.9 flatMap

public <U> Optional<U> flatMap(Function<? super T,Optional<U>> mapper)

功能:如果存在一个值,则将提供的Optional-bearing 映射函数应用于它,返回该结果,否则返回一个空的 Optional。此方法类似于map(Function),但提供的映射器的结果已经是Optional,并且如果被调用,flatMap则不会用额外的 Optional.

  • 类型参数:

U-Optional返回的类型参数

  • 参数:

mapper - 应用于值的映射函数,如果存在映射函数

  • 返回:

Optional-bearing 映射函数应用于 this 的值的结果Optional,如果存在值,否则为空Optional

  • 抛出:

NullPointerException - 如果映射函数为空或返回空结果

2.10 orElse

public T orElse(T other)

功能:如果存在则返回值,否则返回other

  • 参数:

other - 如果不存在值则返回值,可能为空

  • 返回:

值,如果存在,否则 other

2.11 orElseGet

public T orElseGet(Supplier<? extends T> other)

功能:如果存在则返回值,否则调用other并返回该调用的结果。

  • 参数:

other-Supplier如果不存在值则返回其结果

  • 返回:

值(如果存在)否则结果 other.get()

  • 抛出:

NullPointerException- 如果值不存在并且other为空

2.12 orElseThrow

public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier)
                                    throws X extends Throwable

功能:返回包含的值(如果存在),否则抛出由提供的供应商创建的异常。

  • API注意事项:

对带有空参数列表的异常构造函数的方法引用可以用作提供者。例如, IllegalStateException::new

  • 类型参数:

X - 要抛出的异常类型

  • 参数:

exceptionSupplier - 将返回要抛出的异常的供应商

  • 返回:

现值

  • 抛出:

X - 如果没有价值存在

NullPointerException- 如果没有值存在并且 exceptionSupplier为空

X extends Throwable

2.13 equals

public boolean equals(Object obj)

功能:指示某个其他对象是否“等于”此 Optional。在以下情况下,另一个对象被认为是相等的:

  • 它也是一个Optional和;
  • 两个实例都没有价值存在或;
  • 当前值通过 彼此“相等” equals()
  • 覆盖:

equals 在班上 Object

  • 参数:

obj - 要测试是否相等的对象

  • 返回:

{code true} 如果另一个对象“等于”这个对象,否则 false

2.14 hashCode

public int hashCode()

功能:返回当前值的哈希码值(如果有),如果没有值则返回 0(零)。

  • 覆盖:

hashCode 在班上 Object

  • 返回:

当前值的哈希码值,如果没有值则为 0

2.15 toString

public String toString()

功能:返回适合调试的此 Optional 的非空字符串表示形式。确切的表示格式未指定,可能因实现和版本而异。

  • 覆盖:

toString 在班上 Object

  • 实施要求:

如果存在值,则结果必须在结果中包含其字符串表示。Empty 和present Optionals 必须可以明确区分。

  • 返回:

此实例的字符串表示形式


版权声明:本文为weixin_43675226原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。