言っストリームに先立ち、我々は、コレクションを見てみると、なぜですか?Java8のように新しいメンバーが、それは多くの類似点のコレクションを持って、彼らはまた、相互に変換することができます。だけでなく、Java言語、言語のいずれかの概念のコレクションは高度な開発のセットがあり、コレクション名が示唆する、一緒にデータ・セットがたくさんあり、それはコンテナと考えることができ、我々はまた、データ収集の種類を制限するために、ジェネリックを使用することができます。
まず、流れは何ですか
データ収集に対処するための宣言的な方法に私たちを可能にJava8フローの新しいメンバーとして。私たちは、データセット高レベルのイテレータを通じてとしてそれを見ることができます。加えて、流れも透過的にマルチスレッドコードを記述せずに私たちを作る並列に処理することができます。それ以降では、私たちは、平行流の流れと細部の話をしましょう。
我々は、視覚的にJava8前と後の違いを比較するために、コードの一部を使用して、あまり話をしませんでした。
1 パッケージcom.hz; 2 3つの。 インポート java.utilのクラス*。; 4 。5 インポート 静的java.util.stream.Collectors.toList; 6 。7 パブリック クラスStreamDemo { 8 パブリック 静的 ボイドメイン(文字列[]引数){ 9 リスト<警察>ポリシー] = は、Arrays.asList( 10 新新警察( "P001"、 "より多くの警察官より、" 27、 "浙江省" )、 11 新新警察( "P002"、 "リー警察官、" 32 "安徽省" )、 12 新新警察( "P003"、 "チェンの警察官は、" 25 "安徽省")、 13 新警察( "P004"、 "若い警察官、" 35、 "浙江省" )、 14 新新ポリス( "P005"、 "張警察官、" 31、 "上海" )、 15 新新ポリス( "P006"、 "警察官の王" 、42、 "浙江省" )、 16 新新ポリス( "P007"、 "趙官"、31、 "浙江省は" )、 17 新新ポリス( "P008"、 "劉警察官"、49、 "浙江省" )、 18は、 新新警察( "P009"、 "週官"、32、 "浙江省" ) 19 )。 20 21 // 問題:以上の30歳の警察はスクリーニングされ、年齢に応じてソートされた警察の上記収集、スクリーニングの結果は、警察での別のセットの名前保存されている 22 23 / ** ******* ************************** Java7は、上記の課題を達成******************** *************************** * / 24 一覧<警察> tempList = 新しい ArrayListを<> (); 25 のために(警察警察:ポリシー){ 26 であれば(police.getPoliceAge()> 30 ){ 27 tempList.add(警察)。 28 } 29 } 30 Collections.sort(tempList、新しいコンパレータ<警察> (){ 31 @Override 32 公共 のint 比較(警察O1、警察O2){ 33 リターンInteger.compare(o1.getPoliceAge()、o2.getPoliceAge( )); 34 } 35 }); 36 リストの<string> = tempPoliceNameList 新しい新規のArrayList <> (); 37 [ ため(警察警察:tempList){ 38が tempPoliceNameList.add(police.getPoliceName()); 39 } 40 のSystem.out.println(tempPoliceNameList)。 41は 42である のSystem.out.println(「パーティングライン------- -------------------------------- -------------------------------- " ); 43は、 44である / ** ********** *********************** Java8は、上記の課題を達成*********************** ************************ * / 45 リストの<string> tempPoliceNameStream = polices.stream()フィルタ(P - > p.getPoliceAge()> 30 ) 46である (Comparator.comparing(ポリス:: getPoliceAge)).sorted 47 .MAP(ポリス:: getPoliceName) 48 。コレクト(ToListメソッド()); 49 のSystem.out.println(tempPoliceNameStream); 50 51がある // 注:Java8で、並行して実行したい場合は、単にpolices.parallelStreamm(へpolices.stream()に) 52がある } 53があります } 54は、 55件 の結果: 56 [張警察、役員趙リー官、周役員、ヤン官、警察官王、劉警察官] 57 --------------------- -----------分割ライン------------------------------------- - 58 [張警察官、警察官の趙、李警察官、警察官周ヤンの警察官、警察官王、劉警察官]
上記のコード片から、我々はそれを見ることができます:
図1に示すように、コードが宣言方法で書き込まれます。それはあなたではなく実行する方法よりも、仕事を達成したいです。
図2に示すように、チェーンの動作を使用することができます。フィルタが完了するまでの点の後、直接法であってもよいです。
以上のことから、我々は簡単にストリームを使用することの利点をまとめることができます。
1、宣言型:より簡潔で読みやすいです。
2、再利用可能な:より柔軟。
3、パラレル:より良いパフォーマンス。
第二に、導入の流れ
私は上記の流れを読み、比較的単純なコレクション、そして最後にそれが何を流れていますか?我々は、単に説明することができる「操作支援エレメントシーケンスを処理するソースデータから生成されました。」私たちは、この文を解決区別します:
①、要素のシーケンス:コレクション、それがどのようにように、あなたは、特定の要素型の値の順序集合にアクセスすることができます。しかし、それはセットと異なる、データ構造の集合であり、その主な目的は、時間と空間にデータを格納することです。主にフローを計算するために使用されます。彼らは、本質的に異なっています。
、データソースのデータ・ストリームを処理するとき、ソース、すなわち、例えば:②、ソースセットは、ソースファイルがあってもよく、ソースであってもよいです。
③、データは、操作の処理:フィルター/マップ/ソート等:動作フローは、当社のデータベースのようなデータの処理と同様です。ストリームデータを処理するとき、それはまた、順次並行して行うことができます。
ストリームは、動作中2つの明白な機能を備えています。
1、ライン。即ち、フロー操作は、ストリームを返すか、そのような操作は、それによってパイプラインを形成し、バック複数のリンクを有することができます。
図2に示すように、内部反復。流れに対処する上で、我々はバックグラウンドで実行される処理を、見ることができません。私たちは、スクリーニングの警察/私たちは、実装プロセスを見ることができない変換を完了するためにどのように傍受/の後ろにマップされた/空想のリターンをソートすることができます。
三、流量比を設定します
、あなたは再び処理する場合のフローは、記事の流れが完了したことを表してトラバースの終了後、一度だけ通過することができ、Java8収集と流れでお互いを変換することができますが、データ収集の観点から横断を続けることができます私たちは、ストリームオブジェクトを再確立する必要があります。我々が完了している再びストリームを扱う場合は、例外がスローされます。
パッケージcom.hz。 輸入java.util.Arrays。 輸入はjava.util.List; 輸入java.util.stream.Stream; パブリック クラスStreamDemo2 { 公共 静的 ボイドメイン(文字列[]引数){ リストの<string>リスト=は、Arrays.asList( "Javaの"、 "JavaScriptの"、 "パイソン" )。 ストリームの<string>ストリーム= list.stream()。 stream.forEach(のSystem.out ::のprintln)。 System.out.println( "------分割线--------" ); stream.forEach(のSystem.out ::のprintln)。 } } 结果: Javaの JavaScriptの Pythonの ------分割线-------- スレッドの例外「メイン」java.lang.IllegalStateException:ストリームがすでに時に操作またはクローズされた java.util.stream.AbstractPipeline.sourceStageSpliteratorで(AbstractPipeline .javaファイル: 279 ) java.util.stream.ReferencePipeline $ Head.forEach(ReferencePipeline.java時: 580 ) :com.hz.StreamDemo2.main(StreamDemo2.javaで 18 ) sun.reflect.NativeMethodAccessorImpl.invoke0(ネイティブメソッドで) sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java時: 62 ) :sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.javaにおける 43 ) :java.lang.reflect.Method.invoke(Method.javaにおける 498 ) com.intellij.rt.execution.application.AppMain.main(AppMain.javaで: 144)
私たちが知っている結果に基づいて、操作が完了するか、ストリームが閉じられています。私たちは流れを操作したい場合は異常です。
我々は、この2つの反復法が異なっていて、内部流れが反復の集まりでもあるが、一般的に、我々は外部反復の集まりで、反復来る上にありますか?
パッケージcom.hz。 輸入はjava.util.ArrayList; 輸入java.util.Arrays。 インポートするjava.util.Iterator; 輸入はjava.util.List; 輸入 静的java.util.stream.Collectors.toList。 パブリック クラスStreamDemo3 { 公共の 静的な 無効メイン(文字列[] args)を{ 一覧 <ブック>ブック= は、Arrays.asList( 新しいブック( "Javaの入门"、 "张**" )、 新しいブック( "JavaScriptの入门"、「李**」)、 新しいブック( "パイソン入门"、 "王**" 一覧 <文字列> = booksName 新しい新しいのArrayList <> (); // ************ 1-外部反復-それぞれに使用して行う ための(書籍書籍:書籍){ booksName.add(ブック。 getBookName()); } のSystem.out.println(booksName) のSystem.out.println( "分割線--------- ---------" ); booksName.clear() ; // ************ 2-イテレータ(反復子バック)は外部反復を行う イテレータを<ブック> bookIterator = books.iterator(); 一方(bookIterator.hasNext()){ 予約ブック = bookIterator.next(); booksName.add(book.getBookName()); } System.out.println(booksName)。 System.out.println( "--------- ---------分割线" ); booksName.clear(); // ************の1-使用流内部迭代 booksName = 。books.stream()マップ(ブック:: getBookName).collect(ToListメソッド()); System.out.println(booksName)。 } 静的 クラス予約{ プライベート文字列bookName。 プライベート文字列bookAuth。 パブリック文字列getBookName(){ 戻りbookNameと、 } 公共 ボイドsetBookName(文字列bookName){ この .bookName =bookName; } パブリック文字列getBookAuth(){ 戻りbookAuthを; } 公共 ボイドsetBookAuth(文字列bookAuth){ この .bookAuth = bookAuth; } 公共ブック(bookName文字、文字列bookAuth){ この .bookName = bookName; この .bookAuth = bookAuth。 } } } 注:上記のコードは1つのであるから、我々が見ることができる工程2 2反復は、我々は知っている/、我々は3回の反復の詳細を見ることができません。
第四に、基本的な操作の流れ
1から、我々は、コードの一部を見ることができます
。polices.stream()フィルタ(P - > p.getPoliceAge()> 30).sorted(Comparator.comparing(ポリス:: getPoliceAge)).MAP(ポリス:: getPoliceName).collect(ToListメソッド())。
このコードのために我々は二つの部分または二つの操作に分けることができます。
図1に示すように、方法の後流から、フィルタ/ソート/マップは、パイプラインを形成するために、ストリームとして戻されます。
2、すなわち近い収集方法の実行フロー、および非戻りストリームオブジェクト。
これら二つの部分のために、最初の操作は、中間動作、端末操作と呼ばれる第2の操作と呼ぶことにします。
操作の途中では、コードの実際のロジックは、操作の途中が開始される前に、端末操作に直面した場合にのみ、実行して、ストリームの終わりが閉じている知りませんでした。
これらのことから、私たちは主に第1のソースデータがクエリを実行するために必要なことを3つのことを含ま下流まとめることができ、オペレーションの中間チェーンがパイプライン動作を実行するためのパイプラインの流れが再び形成される必要があり、最終的には、端末のニーズと結果を返します。