当前位置: 首页 > 教程 > Java9 >

Java9 Optional类

精华
小牛编辑
115浏览
2023-03-14

在这篇文章中,我们将讨论“Java SE 8的Optional类如何解决空检查问题?”以及“Java SE 9的Optional类改进”。

作为Java开发人员,我们知道为了避免NullPointerException错误而对每个对象进行空检查时需要做不少的工作。

Java SE 8:Optional类基础

Oracle公司已经引入了Optional类作为java.util包的一部分。 它是一个容器对象,它可能包含或不包含非空值。

它主要用于避免大量空检查和NullPointerException问题。 尽管它是java.util包的一部分,但它并未实现任何Collection API接口。 它扩展了Object类,如下所示。

public final class Optional<T> extends Object

它是final类,因此不能重写它。 如果可选对象不为空,则表示该对象中存在值。 如果它是空的,则不存在如下所示的值。

Java SE 8:Optional基本示例

在本节中,我们将探讨如何使用Java SE 8 Optional对象来避免空检查和NullPointerException

它是Optional类中的简单基本示例。 它演示了如何使用Optional.empty()创建一个空的Optional对象,以及如何创建非空的Optional对象。

import java.util.Optional;

public class JavaSE8OptionalDemo
{
  public static void main(String[] args)
  {
    System.out.println(division(4,2));
    System.out.println(division(4,0));
  }


  public static Optional<Integer> division(Integer i1,Integer i2)
  {
    if(i2 == 0) return Optional.empty();
    else {
       Integer i3 = i1/i2;
       return Optional.of(i3);
    }
  }

}

执行上面示例代码,得到以下结果 -

Optional[2]
Optional.empty

Java SE 9:Optional类改进

在Java SE 9中,Oracle公司引入了以下三种方法来改进Optional类功能。几个方法如下所示 -

  • stream()
  • ifPresentOrElse()
  • or()

我们将逐一介绍这些方法,并在接下来的章节中详细讨论一些合适的例子。

Java SE 9:Optional类的stream()方法

如果给定Optional对象中存在一个值,则此stream()方法将返回具有该值的顺序流。 否则,它将返回一个空流。

Java 9已经添加了stream()方法来延迟处理Optional对象,如下所示:

Stream<Optional> emp = getEmployee(id)
Stream empStream = emp.flatMap(Optional::stream)

这里使用Optional.stream()方法将Employee对象的一个OptionalStream转换为一个Employee流,以便可以在结果代码中懒地处理这个结果。

Java SE 8样式:Optional方法

在Java SE 8中,我们应该使用ifPresent()isPresent()orElse()等方法来检查Optional对象并对其执行一些功能。 执行此操作有点繁琐。 但是,Java SE 9引入了一种新方法来解决这个问题。

在这里,我们将探索以下三种可选的类方法:

  • ifPresent() - 如果存在值,则使用该值执行给定操作,否则不执行任何操作。

    void ifPresent(Consumer action)
    
  • isPresent() - 如果存在值,则返回true,否则返回false。

    boolean isPresent()
    
  • orElse() - 如果存在值,则返回该值,否则返回其他值。

public T orElse(T other)

示例代码 -

import java.util.Optional;

public class JavaSE8OptionalDemo
{
  public static void main(String[] args)
  {

    Optional<Integer> opt1 = division(4,2);    
    opt1.ifPresent( x -> System.out.println("Option1: Result found = " + x));

    Optional<Integer> opt2 = division(4,0);    
    opt2.ifPresent( x -> System.out.println("Option2: Result found: " + x));

    System.out.println("Option2: Result not found, default vlaue = " + opt2.orElse(new Integer(0)));

    if(opt2.isPresent())
      System.out.println("Option2: Result found.");
    else
      System.out.println("Option2: Result not found.");

  }

  public static Optional<Integer> division(Integer i1,Integer i2)
  {
    if(i2 == 0) return Optional.empty();
    else {
       Integer i3 = i1/i2;
       return Optional.of(i3);
    }
  }

}

执行上面示例代码,得到以下结果 -

Option1: Result found = 2
Option2: Result not found, default vlaue = 0
Option2: Result not found.

Java SE 9:可选ifPresentOrElse()方法

在本节中,通过使用Java SE 9的Optional类的ifPresentOrElse()方法来探索相同类型的场景。 它以一种很好的方式将ifPresent()isPresent()orElse()方法等所有方法组合在一起。

Java SE 9 Optional类 ifPresentOrElse()API: -

public void ifPresentOrElse(Consumerl<? super Tl> action, Runnable emptyAction)

如果存在值,则使用该值执行给定操作,否则执行给定的基于空的操作。

ifPresentOrElse()示例

jshell> Optional<Integer> opt1 = Optional.of(4)
opt1 ==> Optional[4]

jshell> opt1.ifPresentOrElse( x -> System.out.println("Result found: " + x), () -> System.out.println("Not Found."))
Result found: 4

jshell> Optional<Integer> opt2 = Optional.empty()
opt2 ==> Optional.empty

jshell> opt2.ifPresentOrElse( x -> System.out.println("Result found: " + x), () -> System.out.println("Not Found."))
Not Found.

Java SE 9: Optional类or()方法

在Java SE 9Optional类API中,如果Optional包含值,则使用or()方法返回值。 否则返回供应商中指定的值。 这个or()方法将供应商作为参数来指定默认值。

public Optional<T> or(Supplier<? extends Optional<? extends T>> supplier)

让我们看一个示例,首先在Optional中显示一个值。

Java SE 9 Optional类of()方法

jshell> Optional<String> opStr = Optional.of("Rams")
opStr ==> Optional[Rams]

jshell> import java.util.function.*


jshell> Supplier<Optional<String>> supStr = () -> Optional.of("No Name")
supStr ==> $Lambda$67/222624801@23faf8f2


jshell> opStr.or(supStr)
$5 ==> Optional[Rams]