Java SE 9:可选的类改进

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

介绍

在本文中,我们将讨论" Java SE 8的Optional类如何解决空检查问题?"。
以及" Java SE 9的可选类改进"。

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

Java SE 8:可选的类基础知识

Oracle Corp已将Optional类作为" java.util"包的一部分引入。
它是一个容器对象,可能包含也可能不包含非null值。

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

public final class Optional<T> extends Object

这是最后一堂课,我们不能覆盖它。
如果Optional对象不为空,则表示其中存在一个值。
如果为空,则缺少如下所示的值。

Java SE 8:可选基本示例

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

示例:-这是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:可选的类改进

在Java SE 9中,Oracle Corp引入了以下三种方法来改进Optional功能。

  • 流()
  • ifPresentOrElse()
  • 或者()

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

Java SE 9:可选stream()方法

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

他们添加了" stream()"方法以延迟地处理可选对象,如下所示:

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

这里使用Optional.stream()方法将Employee的Optional对象的Stream转换为Employee的Stream,以便我们可以在结果代码中懒惰地处理此结果。

Java SE 8样式:可选方法

在Java SE 8中,我们应该使用ifPresent(),isPresent()或者Else()等方法来检查Optional对象并对其执行一些功能。
执行该过程比较繁琐。
但是,Java SE 9引入了一种新方法来克服此问题。

让我们在本节中探讨Java SE 8样式。
我们将在下一部分中探索该新方法。

其中我们将探索以下三个Optional类方法:

  • ifPresent()
void ifPresent(Consumer action)

如果存在值,则使用该值执行给定的操作,否则不执行任何操作。

  • 存在()
boolean isPresent()

如果存在值,则返回true,否则返回false。

  • 要不然()
public T orElse(T other)

If a value is present, returns the value, otherwise returns 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的可选ifPresentOrElse()方法来探索相同类型的场景。
它以一种很好的方式结合了所有这些方法,例如ifPresent(),isPresent()和orElse()方法。

Java SE 9可选的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:可选or()方法

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

Java SE 9可选or()API:

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

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

Java SE 9可选or()示例1:

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/222624801@23faf8f2

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

让我们来看一个示例,该示例现在在Optional中不存在一个值。
Java SE 9可选or()示例2:

jshell> Optional<String> opStr = Optional.empty()
opStr ==> Optional.empty

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

jshell> opStr.or(supStr)
 ==> Optional[No Name]