1.概要

Java

Stream

APIは、Java 8リリースの主要機能でした。


Streams

は遅延評価されたオブジェクトのシーケンスを表し、豊富で流暢で、モナド風のAPIを提供します。

この記事では、

Streamの最後の要素を取得する方法について簡単に説明します。

ストリームの性質上、これは自然な操作ではありません

。あなたが無限の

Streams.__で働いていないことを常に確認してください

2.Reduce__APIを使う

単純に置く

Reduce



Stream

の要素の集合を単一の要素に減らします。

この場合、

Streamの最後の要素を取得するために要素のセットを減らします。** このメソッドは、順次

Streamの決定論的結果のみを返すことに注意してください。


String

値の

List

を使用し、

List

から

Stream

を取得して、次に減らしましょう。

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

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

ここでは、ストリームは最後の要素だけを残したレベルに縮小されます。ストリームが空の場合は

null

値を返します。

2.スキップ機能を使う

ストリームの最後の要素を取得するもう1つの方法は、その前のすべての要素をスキップすることです。これは、

Stream

クラスの

Skip

関数を使用して実現できます。この場合、

Stream

を2回消費しているため、パフォーマンスに明らかな影響があることに注意してください。




文字列値の

List

を作成し、その

size

関数を使用して、最後の要素に到達するまでにスキップする要素数を決定します。

これは、

skip

を使用して最後の要素を取得するサンプルコードです。

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

long count = valueList.stream().count();
Stream<String> stream = valueList.stream();

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


“ Sean”

は最後の要素になります。

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

無限ストリームの最後の要素を取得しようとすると、無限要素に対して無限の評価シーケンスが実行されます。

skip



reduce

はどちらも、

limit

操作を使用して無限ストリームを特定の要素数に制限しない限り、評価の実行から戻ってくることはありません。

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

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

その結果、ストリームは評価から戻ってくることはなく、

プログラムの実行を停止

することになります。

5.まとめ


reduce



Skip

の両方のAPIを使用して

Stream

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


Stream

から最後の要素を取得するのは、他のデータ構造からそれを取得するのに比べて簡単ではないことがわかりました。これは端末関数が呼び出されない限り評価されない

Streams

の遅延性のためです。

コードスニペットが見つかります

over on
GitHub。