Javaでストリームの最後の要素を取得する方法

Javaでストリームの最後の要素を取得する方法は?

1. 概要

JavaStream APIは、Java8リリースの主要な機能でした。 Streamsは、遅延評価されたオブジェクトのシーケンスを表し、リッチで流暢なモナドのようなAPIを提供します。

この記事では、Stream.の最後の要素を取得する方法について簡単に説明します。due to the nature of streams, it’s not a natural operationに注意してください。 無限のStreams.を使用していないことを常に確認してください

2. ReduceAPIの使用

Reduceは、簡単に言えば、Stream内の要素のセットを単一の要素に減らします。

この場合、要素のセットを減らして、Stream.の最後の要素を取得します。this method will only return deterministic results for sequential Streams.に注意してください。

String値のListを使用し、ListからStreamを取得して、以下を減らします。

List valueList = new ArrayList<>();
valueList.add("Joe");
valueList.add("John");
valueList.add("Sean");

Stream stream = valueList.stream();
stream.reduce((first, second) -> second)
  .orElse(null);

ここで、ストリームは、最後の要素のみが残されるレベルに削減されます。 ストリームが空の場合、null値を返します。

2. スキップ機能を使用する

ストリームの最後の要素を取得するもう1つの方法は、by skipping all the elements before itです。 これは、StreamクラスのSkip関数を使用して実現できます。 この場合、Streamを2回消費しているため、パフォーマンスに明らかな影響があることに注意してください.

文字列値のListを作成し、そのsize関数を使用して、最後の要素に到達するためにスキップする要素の数を決定しましょう。

skipを使用して最後の要素を取得するサンプルコードを次に示します。

List valueList = new ArrayList();
valueList.add("Joe");
valueList.add("John");
valueList.add("Sean");

long count = valueList.stream().count();
Stream stream = valueList.stream();

stream.skip(count - 1).findFirst().get();

“Sean”が最後の要素になります。

4. 無限ストリームの最後の要素を取得する

無限ストリームの最後の要素を取得しようとすると、無限要素で実行される評価の無限シーケンスにつながります。 limit操作を使用して無限ストリームを特定の数の要素に制限しない限り、skipreduceの両方が評価の実行から返されません。

以下は、無限ストリームを取得して最後の要素を取得しようとしたサンプルコードです。

Stream stream = Stream.iterate(0, i -> i + 1);
stream.reduce((first, second) -> second).orElse(null);

その結果、ストリームは評価から戻らず、最終的にhalting the execution of the programになります。

5. 結論

reduce APIとSkip APIの両方を使用して、Streamの最後の要素を取得するさまざまな方法を見てきました。 また、無限ストリームではこれが不可能な理由も調べました。

Streamから最後の要素を取得することは、他のデータ構造から取得することと比較して簡単ではないことがわかりました。 これは、ターミナル関数が呼び出されない限り評価されないStreamswe never know if the currently evaluated element is the last one.の怠惰な性質によるものです。

コードスニペットはover on GitHub.にあります