1概要

この記事では、


オプション


AP​​IへのJava 9の追加機能を調べます。

モジュール性を超えて、Java 9はまた

Optional

クラスのための3つの非常に役に立つメソッドを追加しています。


2

or()

メソッド

時々、私たちの

Optional

が空のとき、私達はO

__ptional .

__も返す他のアクションを実行したいと思います

以前のJava 9では、

Optional

クラスには

orElse()

メソッドと

orElseGet()

メソッドしかありませんでしたが、どちらもラップされていない値を返す必要がありました。

Java 9では、

Optional

が空の場合、別の

Optional

を遅延的に返す

or()

メソッドが導入されています。最初の

Optional

に定義済みの値がある場合、

or()

メソッドに渡されたラムダは呼び出されず、値は計算されずに返されます。

@Test
public void givenOptional__whenPresent__thenShouldTakeAValueFromIt() {
   //given
    String expected = "properValue";
    Optional<String> value = Optional.of(expected);
    Optional<String> defaultValue = Optional.of("default");

   //when
    Optional<String> result = value.or(() -> defaultValue);

   //then
    assertThat(result.get()).isEqualTo(expected);
}


Optional

bei

__ng


が空の場合、返される

result



defaultValueと同じになります。

@Test
public void givenOptional__whenEmpty__thenShouldTakeAValueFromOr() {
   //given
    String defaultString = "default";
    Optional<String> value = Optional.empty();
    Optional<String> defaultValue = Optional.of(defaultString);

   //when
    Optional<String> result = value.or(() -> defaultValue);

   //then
    assertThat(result.get()).isEqualTo(defaultString);
}


3

ifPresentOrElse()

メソッド


Optional

インスタンスがあるとき、私たちはしばしばその基礎となる値に対して特定のアクションを実行したいと思います。一方、

Optional



empty

の場合は、ログに記録するか、またはメトリックを増やしてその事実を追跡します。


ifPresentOrElse()

メソッドは、そのようなシナリオに対して正確に作成されています。

Optional

が定義されている場合に呼び出される

Consumer

、および

Optional

が空の場合に実行される

Runnable

を渡すことができます。

定義された

Optional

があり、値が存在する場合は特定のカウンターをインクリメントしたいとしましょう。

@Test
public void givenOptional__whenPresent__thenShouldExecuteProperCallback() {
   //given
    Optional<String> value = Optional.of("properValue");
    AtomicInteger successCounter = new AtomicInteger(0);
    AtomicInteger onEmptyOptionalCounter = new AtomicInteger(0);

   //when
    value.ifPresentOrElse(
      v -> successCounter.incrementAndGet(),
      onEmptyOptionalCounter::incrementAndGet);

   //then
    assertThat(successCounter.get()).isEqualTo(1);
    assertThat(onEmptyOptionalCounter.get()).isEqualTo(0);
}

2番目の引数として渡されたコールバックは実行されなかったことに注意してください。

空の

Optionalの場合、

2番目のコールバックが実行されます。

@Test
public void givenOptional__whenNotPresent__thenShouldExecuteProperCallback() {
   //given
    Optional<String> value = Optional.empty();
    AtomicInteger successCounter = new AtomicInteger(0);
    AtomicInteger onEmptyOptionalCounter = new AtomicInteger(0);

   //when
    value.ifPresentOrElse(
      v -> successCounter.incrementAndGet(),
      onEmptyOptionalCounter::incrementAndGet);

   //then
    assertThat(successCounter.get()).isEqualTo(0);
    assertThat(onEmptyOptionalCounter.get()).isEqualTo(1);
}


4

stream()

メソッド

Java 9の

Optional

クラスに追加された最後のメソッドは

stream()

メソッドです。

Javaは非常に流暢で洗練された

Stream

APIを持っています。これはコレクションを操作でき、多くの関数型プログラミングの概念を利用できます。最新のJavaバージョンでは、

Optional

クラスに

stream()

メソッドが導入されています。これにより、

Optional

インスタンスを__Streamとして扱うことができます。

定義された

Optional

があり、それに対して

stream()

メソッドを呼び出しているとしましょう。これにより、

Stream

APIで利用可能なすべてのメソッドを使用できる1つの要素の

Stream

が作成されます


_:

_

@Test
public void givenOptionalOfSome__whenToStream__thenShouldTreatItAsOneElementStream() {
   //given
    Optional<String> value = Optional.of("a");

   //when
    List<String> collect = value.stream().map(String::toUpperCase).collect(Collectors.toList());

   //then
    assertThat(collect).hasSameElementsAs(List.of("A"));
}

一方、

Optional

が存在しない場合は、

stream()

メソッドを呼び出すと、空の__Streamが作成されます。

@Test
public void givenOptionalOfNone__whenToStream__thenShouldTreatItAsZeroElementStream() {
   //given
    Optional<String> value = Optional.empty();

   //when
    List<String> collect = value.stream()
      .map(String::toUpperCase)
      .collect(Collectors.toList());

   //then
    assertThat(collect).isEmpty();
}

すぐにリンクをフィルタリングすることができます:/java-filter-stream-of-optional[

Streams

of

Optionals.

]

空の

Stream

を操作しても効果はありませんが、

stream()

メソッドのおかげで、

Optional

APIと

Stream

APIを連鎖させることができます。これにより、よりエレガントで流暢なコードを作成できます。


5結論

このクイック記事では、Java 9

Optional

APIの追加について調べました。

ソースの

Optional

が空の場合に、

or()

メソッドを使用してOptionalを返す方法を見ました。値が存在する場合は

Consumer

を実行し、それ以外の場合は別のコールバックを実行するために

ifPresentOrElse()

を使用しました。

最後に、

stream()メソッドを使用して

Optional



Stream__ APIとチェインする方法を説明しました。

これらすべての例とコードスニペットの実装はhttps://github.com/eugenp/tutorials/tree/master/core-java-9[GitHubプロジェクト]にあります。そのままインポートして実行するのは簡単です。