オプションまたはorElseオプション

オプションまたはElseオプション

1. 前書き

別のインスタンスが空の場合は、別のOptionalインスタンスにフォールバックしたい場合があります。

このチュートリアルでは、それをどのように行うことができるかについて簡単に説明します。これは見た目よりも難しいことです。

Javaオプションクラスの概要については、previous articleをご覧ください。

2. プレーンJavaの使用

Java 8では、最初のOptionalが空の場合に、異なるOptionalを返す直接的な方法はありません。

したがって、独自のカスタムメソッドを実装できます。

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

そして、実際には:

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

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

@Test
public void givenEmptyOptional_whenValue_thenOptionalGeneralMethod() {
    Optional optionalString = Optional.empty();
    Optional fallbackOptionalString = Optional.ofNullable("Name not provided");

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

一方、Java 9 does add an or() method that we can use to get an Optional, or another value, if that Optional isn’t present

簡単な例でこれを実際に見てみましょう。

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

この例では、補助的な方法を使用して支援しました。

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

テストして、どのように機能するかをさらに理解することができます。 次のテストケースは、Optional が値を共有する場合のデモンストレーションです。

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

3. グアバの使用

これを行う別の方法は、グアバのOptional classのor() methodを使用することです。 まず、プロジェクトにguava を追加する必要があります(最新バージョンはhereにあります)。


    com.google.guava
    guava
    24.1.1-jre

これで、以前と同じ例を続けることができます。

public static com.google.common.base.Optional getOptionalGuavaName(com.google.common.base.Optional name) {
    return name.or(getCustomMessageGuava());
}
private static com.google.common.base.Optional getCustomMessageGuava() {
    return com.google.common.base.Optional.of("Name not provided");
}

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

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

@Test
public void givenGuavaOptional_whenInvoke_thenOptional() {
    String name = "Filan Fisteku";
    Optional 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 orElse Optionalの機能を実現する方法を説明する簡単な記事でした。

ここで説明されているすべての例のコード、およびその他の多くのコードは、over on GitHubにあります。