Java可选

时间:2020-02-23 14:36:43  来源:igfitidea点击:

在本文中,我们将探讨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

如我们所见,我们要过滤字符串列表并获取一个长度大于阈值的值。

此类值可能会或者可能不会存在于列表中。
在这种情况下,OptionalAPI是一个完美的选择。
如您所见,它具有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 &lt;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。