1前書き

他のインスタンスが空の場合、他の

Optional

インスタンスにフォールバックしたい場合があります。

このチュートリアルでは、その方法を簡単に説明します。

Java Optionalクラスの紹介については、リンク:/java-optional[前の記事]を参照してください。


2プレーンJava

の使い方

  • Java 8では、最初のものが空の場合に別の

    Optional

    を返す直接的な方法はありません。**

そのため、独自のカスタムメソッドを実装できます。

public static <T> Optional<T> or(Optional<T> optional, Optional<T> fallback) {
    return optional.isPresent() ? optional : fallback;
}

そして、実際には:

@Test
public void givenOptional__whenValue__thenOptionalGeneralMethod() {
    String name = "Filan Fisteku";
    String missingOptional = "Name not provided";
    Optional<String> optionalString = Optional.ofNullable(name);
    Optional<String> fallbackOptionalString = Optional.ofNullable(missingOptional);

    assertEquals(
      optionalString,
      Optionals.or(optionalString, fallbackOptionalString));
}

@Test
public void givenEmptyOptional__whenValue__thenOptionalGeneralMethod() {
    Optional<String> optionalString = Optional.empty();
    Optional<String> fallbackOptionalString = Optional.ofNullable("Name not provided");

    assertEquals(
      fallbackOptionalString,
      Optionals.or(optionalString, fallbackOptionalString));
}

一方、** Java 9では

Optional

を取得するために使用できる

or()

メソッド、またはその

Optional

が存在しない場合は別の値を追加しています。

簡単な例を使って実際に見てみましょう。

public static Optional<String> getName(Optional<String> name) {
    return name.or(() -> getCustomMessage());
}

私たちは私たちの例で私たちを助けるために補助的な方法を使った:

private static Optional<String> getCustomMessage() {
    return Optional.of("Name not provided");
}

それをテストし、それがどのように機能しているかをさらに理解することができます。次のテストケースは、

__Optional

__が値を持つ場合のデモンストレーションです。

@Test
public void givenOptional__whenValue__thenOptional() {
    String name = "Filan Fisteku";
    Optional<String> optionalString = Optional.ofNullable(name);
    assertEquals(optionalString, Optionals.getName(optionalString));
}


3 Guava

を使う

これを行うもう1つの方法は、グアバの

__Optional


classの


or()


methodメソッドを使用することです。まず、プロジェクトに


guava

__を追加する必要があります(最新バージョンはhttps://mvnrepository.com/artifact/com.google.guava/guava/19.0[here])。

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>24.1.1-jre</version>
</dependency>

今、私たちは以前と同じ例を続けることができます。

public static com.google.common.base.Optional<String> getOptionalGuavaName(com.google.common.base.Optional<String> name) {
    return name.or(getCustomMessageGuava());
}

private static com.google.common.base.Optional<String> getCustomMessageGuava() {
    return com.google.common.base.Optional.of("Name not provided");
}

ご覧のとおり、これは上に表示されたものと非常によく似ています。ただし、メソッドの命名にわずかな違いがあり、JDK 9のクラス

Optional

の____or()メソッドとまったく同じです。

上記の例と同様に、テストすることができます。

@Test
public void givenGuavaOptional__whenInvoke__thenOptional() {
    String name = "Filan Fisteku";
    Optional<String> stringOptional = Optional.of(name);

    assertEquals(name, Optionals.getOptionalGuavaName(stringOptional));
}

@Test
public void givenGuavaOptional__whenNull__thenDefaultText() {
    assertEquals(
      com.google.common.base.Optional.of("Name not provided"),
      Optionals.getOptionalGuavaName(com.google.common.base.Optional.fromNullable(null)));
}


4結論

これは、

OptionalまたはElse Optional

の機能を実現する方法を説明した簡単な記事です。

ここで説明したすべての例のためのコード、そしてもっとたくさんのものがhttps://github.com/eugenp/tutorials/tree/master/core-java-9[GitHubに載っています]にあります。