Javaでストリームする

Javaでストリームする

ストリームが導入されました Java 8 Stream API は、オブジェクトのコレクションを処理するために使用されます。 Java のストリームは、パイプライン化して目的の結果を生成できるさまざまなメソッドをサポートするオブジェクトのシーケンスです。 

Java でのストリームの使用

Java での Stream の使用法を以下に示します。

  • ストリーム API は、オブジェクトのコレクションを表現および処理する方法です。
  • フィルタリング マッピングの削減や並べ替えなどの操作を実行できるようにします。

Java ストリームを作成する方法

Java ストリームの作成は、Java ストリームの機能を検討する前の最も基本的な手順の 1 つです。以下は、Java ストリームを宣言するための構文です。

構文

ストリーム ストリーム;

ここで、 T は、宣言に応じてクラス オブジェクトまたはデータ型のいずれかです。

Javaストリームの機能

Java ストリームの機能は次のとおりです。

  • ストリームはデータ構造ではありません。コレクション配列または I/O チャネルから入力を受け取るだけです。
  • ストリームは元のデータを変更しません。彼らは自分たちの方法を使って結果を生み出すだけです。
  • 中間操作 (フィルター マップなど) は遅延し、別のストリームを返すため、それらを連鎖させることができます。
  • 端末操作 (collect forEach count など) によりストリームが終了し、最終結果が得られます。

ストリームに対するさまざまな操作

ストリームには 2 種類の操作があります。

  1. 中間操作
  2. 端末の操作

中間操作

Java ストリームの操作

中間操作は、複数のメソッドが連続して連鎖する操作のタイプです。

中間操作の特徴

  • メソッドは連鎖していきます。
  • 中間操作は、ストリームを別のストリームに変換します。
  • これにより、あるメソッドがデータをフィルタリングし、処理後に別のメソッドに渡すフィルタリングの概念が可能になります。

重要な中間操作

以下に示すいくつかの中間操作があります。

1.マップ() :map メソッドは、指定された関数をこのストリームの要素に適用した結果で構成されるストリームを返すために使用されます。

構文:

ストリーム マップ(関数 マッパー)

2.フィルター() : filter メソッドは、引数として渡された述語に従って要素を選択するために使用されます。

構文:

ストリーム フィルター(述語 述語)

3.sorted() : ストリームの並べ替えには、sorted メソッドが使用されます。

構文:

ストリーム ソート済み()
ストリーム ソート(コンパレータ コンパレータ)

4. flatMap(): Java Streams の flatMap 操作は、コレクションのストリームを単一の要素のストリームに平坦化するために使用されます。

構文:

ストリーム flatMap(関数 >マッパー)

5. 個別() : 重複した要素を削除します。これは、(Object.equals(Object) に従って) 個別の要素で構成されるストリームを返します。

構文:

ストリーム 明確な()

6. ピーク() : ストリームを変更せずに、各要素に対してアクションを実行します。結果のストリームから要素が消費されるときに、各要素に対して指定されたアクションをさらに実行する、このストリームの要素で構成されるストリームを返します。

構文:

ストリーム ピーク(消費者 アクション)

すべての中間操作の使用法を示す Java プログラム:

Java
   import     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 コレクト(コレクター コレクタ)

2.forEach() : forEach メソッドは、ストリームのすべての要素を反復処理するために使用されます。

構文:

void forEach(コンシューマ アクション)

3.reduce(): Reduce メソッドは、ストリームの要素を単一の値に減らすために使用されます。 reduce メソッドは BinaryOperator をパラメータとして受け取ります。

構文:

Treduce(Tidentity BinaryOperator アキュムレータ)
オプション reduce(BinaryOperator アキュムレータ)

4.カウント() : ストリーム内の要素の数を返します。

構文:

ロングカウント()

5.findFirst() : ストリームの最初の要素が存在する場合はそれを返します。

構文:

オプション findFirst()

6. allMatch() : ストリームのすべての要素が指定された述語に一致するかどうかを確認します。

構文:

boolean allMatch(述語 述語)

7. エニマッチ () : ストリームの要素が指定された述語に一致するかどうかを確認します。

構文:

ブール値 Anymatch (述語) 述語)

ここでは、ans 変数に初期値として 0 が代入され、それに i が加算されます。

注記: 中間操作は、次のメソッドに移動する前に、すべてのメソッドが固定値 (端末操作) を返すことを保証する遅延評価の概念に基づいて実行されます。

すべての端末操作を使用する Java プログラム:

Java
   import     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レスポンスの処理用
  • データベース操作用
  • 同時処理