平行ストリームとシリアルストリーム
並列ストリームは、コンテンツを複数のデータブロックに分割し、各データブロックのストリームを異なるスレッドで個別に処理することです。
並列最適化はJava 8で実行されるため、データを並列に簡単に操作できます。 Stream APIは、parallel()とsequential()を介して平行ストリームとシーケンシャルストリームを宣言的に切り替えることができます。
フォーク/結合フレームワークを理解します
Fork/Join Framework:必要に応じて、大きなタスクがいくつかの小さなタスクに分割され(分解できない場合)、各小さなタスクの実行結果が一緒に追加されます。
フォーク/結合フレームワークと従来のスレッドプールの違い:
「ワークスティール」モードを使用します。
新しいタスクが実行されると、小さなタスクの実行に分割し、スレッドキューに小さなタスクを追加し、ランダムスレッドのキューから盗み、独自のキューに入れます。
一般的なスレッドプールの実装と比較して、フォーク/参加フレームワークの利点は、そこに含まれるタスクの処理方法に反映されています。一般的なスレッドプールでは、スレッドが何らかの理由で実行され続けないタスクを実行している場合、スレッドは待機状態になります。ただし、Fork/Join Frameworkの実装では、別のサブ問題の完了を待っているため、サブ問題が実行され続けない場合。次に、サブ問題を処理するスレッドは、実行のためにまだ実行されていない他のサブプラームを積極的に探します。この方法により、スレッドの待ち時間が短縮され、パフォーマンスが向上します。
java.time.duration; Import java.time.instant; Import java.util.concurrent.forkjoinpool; Import java.util.concurrent.forkjointask; Import java.util.concurrent.Recursivetask; Import Java.util.stream.longStream; xx){} private static void test1(){instant start = instant.now(); forkjoinpool pool = new forkjoinpool(); forkjointask <long> task = new forkjoincalculate(0L、1000000000L); long sum = pool.invoke(task); System.out.println(sum); instant end = instant.now(); System.out.println( "Consuptime"+duration.between(start、end).tomillis()+"ms"); //消費時間3409ms} private static void test2(){instant start = instant.now(); long sum = longstream.rangeclosed(0l、10000l).parallel().reduce(0、long :: sum); System.out.println(sum); instant end = instant.now(); System.out.println( "消費時間" + duration.between(start、end).tomillis() + "ms"); //消費時間2418ms}} class forkjoincalculateはrecursivetask <long> {private static final long serialversionuid = 12345678890l; //プライベートロングエンド; private static final long threshold = 2500000000l; // clational value public forkjoincalculate(long start、long end){this.start = start; this.end = end; } @Override Protected long compute(){long length = end -start; if(length <= threshold){long sum = 0; for(long i = start; i <= end; i ++){sum+= i; } return sum; } else {long middle =(start+end)/2; forkjoincalculate left = new forkjoincalculate(start、middle); left.fork(); forkjoincalculate right = new forkjoincalculate(中央+1、終了); right.fork(); return left.join() + right.join(); }}}オプションのクラス
オプション<t>クラス(java.util.optional)は、値が存在するか存在しないかを表すコンテナクラスです。
nullは、値が存在しないことを意味し、現在オプションがこの概念をよりよく表現できることを意味します。また、nullポインターの例外を回避できます。
一般的な方法:
optional.of(t t):オプションのインスタンスを作成します
optional.empty():空のオプションインスタンスを作成します
optional.ofnullable(t t):tがnullでない場合は、オプションのインスタンスを作成します。そうでなければ、空のインスタンスを作成します。
ispresent():値が含まれているかどうかを決定します
orelse(t t):コールオブジェクトに値が含まれている場合、値を返し、それ以外の場合はtを返します。
orelseget(サプライヤー):コールオブジェクトに値が含まれている場合、sで取得した値を返します。
マップ(関数F):処理する値があり、処理されたオプションを返す場合、それ以外の場合は、optional.empty()を返します。
flatmap(function mapper):マップと同様に、返品値はオプションでなければなりません
public class optionalTest1 {public static void main(string [] args){string s = new String( "ha"); // optional <string> op = optional.of(null); // // string s1 = op.get(); // system.out.println(s1); // optional <string> op1 = optional.empty(); // string s1 = op1.get(); // system.out.println(s1);オプション<String> op1 = optional.ofnullable(null); // System.out.println(op1.ispresent()); // System.out.println(op1.orelse(new String( "Google"))); //system.out.println(op1.orelseget(() - > new String( "Ali"))); optional <string> op2 = op1.map((x) - > x.tolowercase());文字列s2 = op2.get(); System.out.println(s2); }} @test public void test5(){man man = new Man();文字列名= getGodnessName(Man); System.out.println(name); } //要件:男の心の中で女神の名前を取得しますgetgodnessname(man man){if(man!= null){godness g = man.getgod(); if(g!= null){return g.getname(); }} "Teacher Cang"を返します。 } // Optional Entity class @test public void test6(){optional <godness> godness = optional.ofnullable(new Godness( "lin chiling"));オプション<NewMan> op = optional.ofnullable(new Newman(Godness));文字列名= getGodnessName2(op); System.out.println(name); } public String getGodnessName2(Optional <Newman> Man){return man.orelse(new newman()).getGodness().orelse(new Godness( "Teacher Cang")).getName(); } //注:オプションはシリアル化することはできませんパブリッククラスニューマン{private optional <godness> godness = optional.empty();私的な神の神; public Optional <Godness> getGod(){return optional.of(god); } public newman(){} public newman(optional <godness> godness){this.godness = godness; } public Optional <Godness> getGodness(){return godness; } public void setgodness(optional <godness> godness){this.godness = godness; } @Override public String toString(){return "newman [godness =" + godness + "]"; }}上記は、私たちがあなたのためにコンパイルしたJava 8でForkjoinとオプションのフレームワークを使用したすべての経験です。あなたがまだ学んでいるときに理解していないものをまだ理解していない場合は、以下のメッセージ領域で議論することができます。