Java 9のオプションのAPIの追加
1概要
この記事では、
オプション
APIへの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プロジェクト]にあります。そのままインポートして実行するのは簡単です。