ストリームが導入されました Java 8 Stream API は、オブジェクトのコレクションを処理するために使用されます。 Java のストリームは、パイプライン化して目的の結果を生成できるさまざまなメソッドをサポートするオブジェクトのシーケンスです。
Java でのストリームの使用
Java での Stream の使用法を以下に示します。
- ストリーム API は、オブジェクトのコレクションを表現および処理する方法です。
- フィルタリング マッピングの削減や並べ替えなどの操作を実行できるようにします。
Java ストリームを作成する方法
Java ストリームの作成は、Java ストリームの機能を検討する前の最も基本的な手順の 1 つです。以下は、Java ストリームを宣言するための構文です。
バケットソート
構文
ストリーム
ストリーム;
ここで、 T は、宣言に応じてクラス オブジェクトまたはデータ型のいずれかです。
Javaストリームの機能
Java ストリームの機能は次のとおりです。
- ストリームはデータ構造ではありません。コレクション配列または I/O チャネルから入力を受け取るだけです。
- ストリームは元のデータを変更しません。彼らは自分たちの方法を使って結果を生み出すだけです。
- 中間操作 (フィルター マップなど) は遅延し、別のストリームを返すため、それらを連鎖させることができます。
- 端末操作 (collect forEach count など) によりストリームが終了し、最終結果が得られます。
ストリームに対するさまざまな操作
ストリームには 2 種類の操作があります。
- 中間操作
- 端末の操作
中間操作

中間操作は、複数のメソッドが連続して連鎖する操作のタイプです。
中間操作の特徴
- メソッドは連鎖していきます。
- 中間操作は、ストリームを別のストリームに変換します。
- これにより、あるメソッドがデータをフィルタリングし、処理後に別のメソッドに渡すフィルタリングの概念が可能になります。
重要な中間操作
以下に示すいくつかの中間操作があります。
1.マップ() :map メソッドは、指定された関数をこのストリームの要素に適用した結果で構成されるストリームを返すために使用されます。
構文:
ストリーム マップ(関数 super T ? extends R>マッパー)
2.フィルター() : filter メソッドは、引数として渡された述語に従って要素を選択するために使用されます。
構文:
ストリーム
フィルター(述語 super T>述語)
3.sorted() : ストリームの並べ替えには、sorted メソッドが使用されます。
構文:
ストリーム
ソート済み()
ストリームソート(コンパレータ super T>コンパレータ)
4. flatMap(): Java Streams の flatMap 操作は、コレクションのストリームを単一の要素のストリームに平坦化するために使用されます。
構文:
ストリーム flatMap(関数 super T ? extends Stream extends R>>マッパー)
5. 個別() : 重複した要素を削除します。これは、(Object.equals(Object) に従って) 個別の要素で構成されるストリームを返します。
構文:
ストリーム
明確な()
6. ピーク() : ストリームを変更せずに、各要素に対してアクションを実行します。結果のストリームから要素が消費されるときに、各要素に対して指定されたアクションをさらに実行する、このストリームの要素で構成されるストリームを返します。
構文:
ストリーム
ピーク(消費者 super T>アクション)
すべての中間操作の使用法を示す Java プログラム:
Javaimport java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.stream.Collectors; public class StreamIntermediateOperationsExample { public static void main(String[] args) { // List of lists of names List<List<String>> listOfLists = Arrays.asList( Arrays.asList('Reflection' 'Collection' 'Stream') Arrays.asList('Structure' 'State' 'Flow') Arrays.asList('Sorting' 'Mapping' 'Reduction' 'Stream') ); // Create a set to hold intermediate results Set<String> intermediateResults = new HashSet<>(); // Stream pipeline demonstrating various intermediate operations List<String> result = listOfLists.stream() .flatMap(List::stream) .filter(s -> s.startsWith('S')) .map(String::toUpperCase) .distinct() .sorted() .peek(s -> intermediateResults.add(s)) .collect(Collectors.toList()); // Print the intermediate results System.out.println('Intermediate Results:'); intermediateResults.forEach(System.out::println); // Print the final result System.out.println('Final Result:'); result.forEach(System.out::println); } }
出力
Intermediate Results: STRUCTURE STREAM STATE SORTING Final Result: SORTING STATE STREAM STRUCTURE
説明:
- listOfLists は、他の文字列リストを含むリストとして作成されます。
- flatMap(リスト::ストリーム): ネストされたリストを単一の文字列ストリームに平坦化します。
- フィルター(s -> s.startsWith('S')) : 文字列をフィルタリングして、「S」で始まる文字列のみを含めます。
- マップ(文字列::大文字) : ストリーム内の各文字列を大文字に変換します。
- 明確な() : 重複した文字列を削除します。
- ソート済み() : 結果の文字列をアルファベット順に並べ替えます。
- ピーク(...): 処理された各要素を中間検査用のintermediateResults セットに追加します。
- 収集(Collectors.toList()): 最終的に処理された文字列を result という名前のリストに収集します。
プログラムは、intermediateResults セットに格納されている中間結果を出力します。最後に、すべてのストリーム操作後に完全に処理された文字列を含む結果リストを出力します。
端末の操作
ターミナル オペレーションは、結果を返すオペレーションのタイプです。これらの操作はそれ以上処理されず、最終結果値を返すだけです。
重要な端末操作
1.収集() :collect メソッドは、ストリームに対して実行された中間操作の結果を返すために使用されます。
構文:
R コレクト(コレクター super T A R>コレクタ)
2.forEach() : forEach メソッドは、ストリームのすべての要素を反復処理するために使用されます。
リストノードJava
構文:
void forEach(コンシューマ super T>アクション)
3.reduce(): Reduce メソッドは、ストリームの要素を単一の値に減らすために使用されます。 reduce メソッドは BinaryOperator をパラメータとして受け取ります。
構文:
Treduce(Tidentity BinaryOperator
アキュムレータ)
オプションreduce(BinaryOperator アキュムレータ)
4.カウント() : ストリーム内の要素の数を返します。
構文:
ロングカウント()
5.findFirst() : ストリームの最初の要素が存在する場合はそれを返します。
構文:
オプション
findFirst() javaxor
6. allMatch() : ストリームのすべての要素が指定された述語に一致するかどうかを確認します。
構文:
boolean allMatch(述語 super T>述語)
7. エニマッチ () : ストリームの要素が指定された述語に一致するかどうかを確認します。
構文:
ブール値 Anymatch (述語) super T>述語)
ここでは、ans 変数に初期値として 0 が代入され、それに i が加算されます。
注記: 中間操作は、次のメソッドに移動する前に、すべてのメソッドが固定値 (端末操作) を返すことを保証する遅延評価の概念に基づいて実行されます。
すべての端末操作を使用する Java プログラム:
Javaimport java.util.*; import java.util.stream.Collectors; public class StreamTerminalOperationsExample { public static void main(String[] args) { // Sample data List<String> names = Arrays.asList( 'Reflection' 'Collection' 'Stream' 'Structure' 'Sorting' 'State' ); // forEach: Print each name System.out.println('forEach:'); names.stream().forEach(System.out::println); // collect: Collect names starting with 'S' into a list List<String> sNames = names.stream() .filter(name -> name.startsWith('S')) .collect(Collectors.toList()); System.out.println('ncollect (names starting with 'S'):'); sNames.forEach(System.out::println); // reduce: Concatenate all names into a single string String concatenatedNames = names.stream().reduce( '' (partialString element) -> partialString + ' ' + element ); System.out.println('nreduce (concatenated names):'); System.out.println(concatenatedNames.trim()); // count: Count the number of names long count = names.stream().count(); System.out.println('ncount:'); System.out.println(count); // findFirst: Find the first name Optional<String> firstName = names.stream().findFirst(); System.out.println('nfindFirst:'); firstName.ifPresent(System.out::println); // allMatch: Check if all names start with 'S' boolean allStartWithS = names.stream().allMatch( name -> name.startsWith('S') ); System.out.println('nallMatch (all start with 'S'):'); System.out.println(allStartWithS); // anyMatch: Check if any name starts with 'S' boolean anyStartWithS = names.stream().anyMatch( name -> name.startsWith('S') ); System.out.println('nanyMatch (any start with 'S'):'); System.out.println(anyStartWithS); } }
出力:
出力説明:
- 名前リストはサンプル文字列を使用して作成されます。
- それぞれ: リスト内の各名前を出力します。
- 集める : 「S」で始まる名前をフィルタリングし、新しいリストに収集します。
- 減らす : すべての名前を 1 つの文字列に連結します。
- カウント :名前の総数をカウントします。
- 最初に見つける : リスト内の名を検索して出力します。
- すべて一致 : すべての名前が「S」で始まるかどうかを確認します。
- 不運 : 「S」で始まる名前があるかどうかを確認します。
プログラムは、「S」で始まる各名前、連結名、名前の数、名前、すべての名前が「S」で始まるかどうか、および「S」で始まる名前があるかどうかを出力します。
Java ストリームの利点
以下に示すように、Java で Stream を使用することでいくつかの利点があります。
- ストレージなし
- 関数のパイプライン
- 怠惰
- 無限にできる
- 並列化可能
- コレクション配列、ファイル、行、ストリームのメソッド、IntStream などから作成できます。
Java ストリームの実世界の使用例
ストリームは、最新の Java アプリケーションで次の目的で広く使用されています。
- データ処理
- JSON/XMLレスポンスの処理用
- データベース操作用
- 同時処理