Java 8 Stream要約

20592 ワード

Stream
Java 8のStream apiはjava.util.streamパッケージにあります.最もコアなStreamインタフェースが含まれており、1つのStreamインスタンスが要素シーケンスのセットをシリアルまたはパラレルに操作できます.すべてのストリーム操作はstream pipelineに結合されます.
このスタイルでは、処理する要素の集合をストリームと見なし、ストリームがパイプ内で伝送され、フィルタリング、ソート、集約など、パイプのノード上で処理することができます.
流れとは
stream pilelineには、まず配列、集合、ジェネレータ関数、またはIOチャネルである可能性があるデータソースがあります.ストリーム操作中にソースのデータは変更されません.次に、受信したストリームを別のストリーム(例えばfilter)に変換するゼロまたは複数の中間動作がある.最後にもう1つの終了操作があり、sumなどの最終結果が生成されます.ストリームは不活性な操作であり、すべてのソースデータの計算は、終了操作が初期化されたときにのみ実行されます.Stream(ストリーム)は、データ・ソースからの要素キューであり、集約操作要素をサポートします.特定のタイプのオブジェクトであり、キューを形成します.JavaのStreamは要素を格納するのではなく、オンデマンドで計算されます.≪データ・ソース|Data Source|oem_src≫:ストリームのソース.集合,配列,I/O channel,ジェネレータgeneratorなどであってもよい.集約操作:filter、map、reduce、find、match、sortedなどのSQL文のような操作.以前のCollection操作とは異なり、Stream操作には2つの基本的な特徴があります.Pipelining::中間操作はストリームオブジェクト自体を返します.これにより、フロースタイル(fluent style)のように、複数の操作を1つのパイプに直列に接続することができる.これにより、遅延実行(laziness)やショート(short-circuiting)などの操作を最適化することができる.内部反復:以前は集合遍歴はIteratorまたはFor-EAchによって明示的に集合外部で反復されていたが,これを外部反復と呼ぶ.Streamは、ビジターモード(Visitor)によって実現される内部反復を提供する.
ストリームの生成
Java 8では、集合インタフェースには、stream()−集合のシリアルストリームを作成する2つの方法がある.parallelStream()−コレクションの並列ストリームを作成する.
public static void main(String[] args) {     
    List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd", "", "jkl");             
    List<String> filtered = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList()); 
    }

forEach
Streamは、ストリーム内の各データを反復する新しい方法「forEach」を提供します.次のコードクリップはforEachを使用して10個の乱数を出力します.
Random random = new Random(); random.ints().limit(10).forEach(System.out::println);

Map
mapメソッドは、各要素を対応する結果にマッピングするために使用され、次のコードフラグメントはmapを使用して要素に対応する平方数を出力します.
List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5); //          List squaresList = numbers.stream().map(i -> i * i).distinct().collect(Collectors.toList());

Filter
filterメソッドは、条件を設定することによって要素をフィルタするために使用されます.次のコードクリップはfilterメソッドを使用して空の文字列をフィルタします.
List<String>strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl"); //           
int count = (int) strings.stream().filter(string -> string.isEmpty()).count();

Limit
limitメソッドは、指定された数のストリームを取得するために使用されます.次のコードクリップはlimitメソッドを使用して10個のデータを印刷します.
Random random = new Random(); 
random.ints().limit(10).forEach(System.out::println);

Stored
sorted法は対流の並べ替えに用いられる.次のコードクリップはsortedメソッドを使用して出力の10個の乱数をソートします.
Random random = new Random(); random.ints().limit(10).sorted().forEach(System.out::println);

パラレルプログラム
parallelStreamはストリームパラレルプロセッサの代替方法である.次の例では、parallelStreamを使用して空の文字列の数を出力します.
List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd", "", "jkl"); //           
int count = (int) strings.parallelStream().filter(string -> string.isEmpty()).count();

Collectors
Collectorsクラスは、ストリームを集合および集約要素に変換するなど、多くの帰約操作を実現します.Collectorsは、リストまたは文字列を返すために使用できます.
List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd", "", "jkl"); List<String> filtered = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList()); 
System.out.println("    : " + filtered); 
String mergedString = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.joining(", ")); 
System.out.println("     : " + mergedString);

統計
また、統計結果を生成するコレクタの中にも非常に役立ちます.これらは主にint、double、longなどの基本タイプに用いられ、以下のような統計結果を生成するために用いることができる.
List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5); 
IntSummaryStatistics stats = numbers.stream().mapToInt((x) -> x).summaryStatistics(); System.out.println("        : " + stats.getMax()); 
System.out.println("        : " + stats.getMin()); 
System.out.println("      : " + stats.getSum()); System.out.println("    : " + stats.getAverage());

参考記事:https://www.runoob.com/java/java8-streams.html