Java可选
在本文中,我们将探讨Java 8中引入的Java Optional类。
Java可选
NullPointerException是Java编程中最常见的异常之一。
Null值通常表示不存在值,必须在继续进行常规业务逻辑之前进行处理,这会导致不必要的null检查。为了在空检查情况下处理此类样板代码,Java 8引入了
Optional
类。
在本文中,我们将详细研究Java 8 Optional类API如何帮助我们处理空值。Java 8流API和收集方法可以返回
Optional
对象。
它可能包含也可能不包含非null值。
API中提供了多种方法,以方便,可靠的方式处理Optional值。Java Optional是最后一个类。
Java 8可选示例
让我们看一个示例,以便在使用Optional
类的对象会有所帮助时获得清晰的想法。
List<String> listOfStrings = Arrays.asList("Mark", "Howard", "Anthony D'Cornian"); Optional<String> largeString = listOfStrings.stream().filter(str -> str.length() > 10).findAny(); largeString.ifPresent(System.out::println); Optional<String> veryLargeString = listOfStrings.stream().filter(str -> str.length() > 20).findAny(); veryLargeString.ifPresent(System.out::println);
输出:
Anthony D'Cornian
如我们所见,我们要过滤字符串列表并获取一个长度大于阈值的值。
此类值可能会或者可能不会存在于列表中。
在这种情况下,Optional
API是一个完美的选择。
如您所见,它具有ifPresent
方法,该方法可以让我们定义如何处理该值(如果有)。
在我们的例子中,veryLargeString
将不包含任何值,因此不会打印任何内容。
Java 8 Optional API提供了几种这样的方法。
在下一部分中,我们将详细探讨它们。
Java可选方法
static Optional empty()
:它创建并返回一个空的Optional
实例。boolean isPresent():如果存在值,则返回true,否则返回false。
`void ifPresent(Consumer Consumer):如果存在一个值,则此方法使用该值调用指定的使用者,否则不执行任何操作。
如我们所见,在第一个示例中:
给出了输出:T get():如果Optional中存在一个值,则此方法返回该值,否则抛出NoSuchElementException。
如您所料
也将打印T orElse(T otherValue):此方法返回值(如果存在),否则返回参数中提供的otherValue。
当我们不确定"可选"是否会包含值时,最好使用此方法,而不是简单的" get()"。
将打印:
也可以使用" orElseGet(Supplier other)"方法,该方法调用供应商函数或者执行lambda以获取值,而不是返回硬编码值。
也会打印相同的值。
static Optional <T> of(T value)
:返回带有指定的当前非空值的Optional。Optional filter(Predicate predicate)
:它将谓词作为参数并返回Optional对象。
如果满足谓词的条件,则按原样返回Optional,否则将返回空的Optional。
输出:
可选API中还提供了equals(),hashcode()和toString()方法。
Java 9可选类增强
Java 9在Optional类中引入了一些另外的方法:
public void ifPresentOrElse(Consumer <?super T> action,Runnable emptyAction):如果存在值,则使用该值执行给定的操作,否则执行给定的基于空的操作。
public Optional<T> or(Supplier<? extends Optional<? extends T>> supplier)
:如果存在值,则返回描述该值的Optional,否则返回由供应函数产生的Optional。public Stream <T> stream():如果存在值,则返回仅包含该值的顺序Stream,否则返回空Stream。