Java 可選

2018-03-12 16:49 更新

Java流 - Java可選


Java 8引入了一個(gè)java.util.Optional類來優(yōu)雅地處理NullPointerException。

Optional是可以包含或不包含非空值的非空值的包裝器。

可能返回null的方法應(yīng)返回Optional,而不是null。

如果其包含非空值,則來自可選<T>的isPresent()返回true,否則返回false。

如果get()方法包含非空值,則返回非空值,否則拋出NoSuchElementException。

當(dāng)一個(gè)方法返回一個(gè)可選,你必須檢查它是否包含一個(gè)非空值,然后再詢問它的值。

如果在確保它包含非空值之前調(diào)用了get()方法,則會(huì)拋出NoSuchElementException,而不是拋出NullPointerException。


創(chuàng)建可選對(duì)象

Optional <T>類提供了三個(gè)靜態(tài)工廠方法來創(chuàng)建Optional對(duì)象。

  • <T>可選<T> empty()
    返回一個(gè)空的Optional。
    從此方法返回的可選<T>不包含非空值。
  • <T>(T值)的可選<T>
    返回一個(gè)包含指定值作為非空值的Optional。
    如果指定的值為null,它會(huì)拋出NullPointerException。
  • <T>可選的T值(T值)
    如果值為非空,則返回包含指定值的Optional。
    如果指定的值為null,則返回一個(gè)空的Optional。

以下代碼顯示如何創(chuàng)建Optional對(duì)象:

import java.util.Optional;

public class Main {
  public static void main(String[] args) {
    Optional<String> empty  = Optional.empty();
    System.out.println(empty);

    Optional<String> str = Optional.of("m.hgci.cn");
    System.out.println(str);

    String nullableString = ""; 
    Optional<String> str2  = Optional.of(nullableString);
    System.out.println(str2);
  }
}

上面的代碼生成以下結(jié)果。

例2

如果包含非空值,以下代碼將在可選中打印值:

import java.util.Optional;

public class Main {
  public static void main(String[] args) {
    Optional<String> str = Optional.of("m.hgci.cn");

    if (str.isPresent()) {
      String value = str.get();
      System.out.println("Optional contains " + value);
    } else {
      System.out.println("Optional is  empty.");
    }
  }
}

上面的代碼生成以下結(jié)果。

可選ifPresent

if Present(Consumer<? super T> action)方法對(duì)Optional中包含的值執(zhí)行操作。

如果Optional是空的,這個(gè)方法不做任何事情。

以下代碼打印出來自O(shè)ptional的內(nèi)容。

import java.util.Optional;

public class Main {
  public static void main(String[] args) {
    Optional<String> str = Optional.of("m.hgci.cn");

    str.ifPresent(value -> System.out.println("Optional contains " + value));
  }
}

上面的代碼生成以下結(jié)果。

如果Optional是空的,代碼將不會(huì)打印任何東西。

可選值

以下是獲取可選值的四個(gè)方法:

  • T get()
    返回Optional中包含的值。如果Optional是空的,它會(huì)拋出一個(gè)NoSuchElementException異常。
  • T orElse(T defaultValue)
    返回Optional中包含的值。
    如果Optional為空,它返回指定的defaultValue。
  • T orElseGet(Supplier<? extends T> defaultSupplier)
    返回Optional中包含的值。
    如果Optional為空,則返回從指定的defaultSupplier返回的值。
  • <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X extends Throwable
    返回Optional中包含的值。
    如果Optional為空,它將拋出從指定的exceptionSupplier返回的異常。

OptionalInt,OptionalLong和OptionalDouble處理可選的基本值。

  • OptionalInt類中的getAsInt()方法返回int值。
  • getAsLong()方法從OptionalLong類返回long值。
  • getAsDouble()方法從OptionalDouble類返回double值。

基本可選類的getters當(dāng)它們?yōu)榭諘r(shí)也會(huì)拋出NoSuchElementException。

以下代碼顯示了如何使用OptionalInt類:

import java.util.OptionalInt;

public class Main {
  public static void main(String[] args) {
    OptionalInt number = OptionalInt.of(2);

    if (number.isPresent()) {
      int value = number.getAsInt();
      System.out.println("Number is " + value);
    } else {
      System.out.println("Number is absent.");
    }
  }
}

上面的代碼生成以下結(jié)果。

流可選值

一些流操作返回可選。 例如,所有流類中的max()方法返回一個(gè)可選對(duì)象。 當(dāng)對(duì)空流使用max()方法時(shí),返回值是一個(gè)沒有內(nèi)容的可選對(duì)象。

通過使用可選類,我們可以優(yōu)雅地處理這些方法的返回值。

以下代碼顯示了如何使用返回的max()形式的Optional對(duì)象。

import java.util.OptionalInt;
import java.util.stream.IntStream;

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

    OptionalInt maxOdd = IntStream.of(10, 20, 30).filter(n -> n % 2 == 1).max();
    if (maxOdd.isPresent()) {
      int value = maxOdd.getAsInt();
      System.out.println("Maximum odd  integer is " + value);
    } else {
      System.out.println("Stream is  empty.");
    }
  }
}

上面的代碼生成以下結(jié)果。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)