java8平行()およびシーケンシャル()の後に平行流れと平行に切り替えられます
パッケージ化ストリームを、 輸入java.time.Duration。 輸入java.time.Instant; 輸入java.util.concurrent.ForkJoinPool; 輸入java.util.concurrent.ForkJoinTask; 輸入java.util.concurrent.RecursiveTask; 輸入java.util.stream.LongStream; / ** * @autour ZDC * @Create 2020-03-24-23:53 * / パブリック クラス ForkJoinCaculateは拡張 RecursiveTask <ロング> { プライベート 静的 最終 長い serialVersionUIDの= 1222222Lを。 プライベートロングスタート。 民間 長い終わり。 プライベート 静的 長い THESHOLD = 10000L 。 公共 ForkJoinCaculate(ロング開始、長い端){ この .start = 始めます。 この .END = 終わり。 } @Overrideは、 保護されたロング計算(){ 長い長さ=エンド開始し、 もし(長さ< THESHOLD){ 長い和= 0 。 用(ロング ; I <= END; iは=起動I ++ ){ 合計 + = I。 } 戻り値の和。 } 他{ ロング半ば =(+端を開始)/ 2 。 ForkJoinCaculateは左 = 新しいForkJoinCaculate(スタート、途中の); left.fork(); ForkJoinCaculate右 = 新しい ForkJoinCaculate(ミッド+ 1 、エンド)。 right.fork(); リターン left.join()+ right.join(); } } パブリック 静的 ボイドメイン(文字列[]引数){ インスタントスタート = Instant.now()。 ForkJoinPoolプール= 新しいForkJoinPool()。 ForkJoinTask <ロング>タスク= 新しい ForkJoinCaculate(0リットル、10億リットル); ロング合計 = pool.invoke(タスク)。 System.out.println(合計)。 インスタント端 = Instant.now()。 System.out.println(Duration.between(開始、終了).toMillis())。 インスタントSTART1 = Instant.now()。 合計 = 0リットル。 以下のために(ロングiが0リットル=; I <=10億リットル; I ++ ){ 合計 + = I。 } のSystem.out.println(合計)。 END1インスタント = Instant.now(); のSystem.out.println(Duration.between(START1、END1).toMillis()); // パラレル()およびシーケンシャル()はjava8後パラレルフローストリームと並列に切り替えられる ロング SUM1 = LongStream .rangeClosed(0、1000000000).reduce(0 、ロング:: SUM); ロング。LongStream.rangeClosed SUM2 =(0、1000000000).PARALLEL()を小さく(0 、ロング:: SUM); ロング SUM3 = LongStream.rangeClosed (0、1000000000).sequential()を低減(0 、ロング:: SUM) のSystem.out.println(SUM2); } }
オプショナル
@Test 公共 無効Test3は(){ // 任意の容器はすぐにNullPointerException NullPointerExceptionがトラブルを避けるにロックすることができます 省略可能 <人> OP = Optional.of(新しい新しい人( "ZZZ"、33は、445Dを)); // オプションの<人> Optional.of OP1 =(NULL); //は異常報告 オプションの <人を> Optional.empty OP3 =(); //は空のインスタンスを作成 // するSystem.out.println(op3.getを() ); // 異常報告 // オブジェクトのインスタンスを作成ヌル上を通過ヌルは、複合体の構築と空上を通過する オプションOP4 = Optional.ofNullable <人>(NULL ;) オプション(<人> OP5 = Optional.ofNullable 新しい新人物( "ZZ"、22,11.3 )); IF (op3.isPresent()){ するSystem.out.println( "op3w空でない" ); } 他{ するSystem.out.println( "nulll" ); } // 戻りヌル値にOP3はorElse(T T)指定された 人物ZZZ = op3.orElse(新しい新規人物( "ZZZ"、22であり、22.2 ;)) // Sの戻り値にorElseGet(サプライヤ複数) OP3。 orElseGet(人:: 新新); // nullのコンストラクタの引数を返すため、サプライヤーインターフェース // 地図のプロセスであれば、その値 省略可能<文字列> op5.map S =(P - > p.getName()); / / flatMap復帰オプション 任意の<string> S1 = op5.flatMap(P - > Optional.of(p.getName()))。 }
nullポインタ例外を解決します:
パッケージ化ストリームを、 / ** * @autour ZDC * @Create 2020-03-25-01:00 * / パブリック クラス犬{ プライベート文字列のボール。 パブリック犬(){ } 公共犬(文字列のボール){ この .ball = ボール。 } パブリック文字列getBall(){ 戻りボール。 } パブリック 静的 ボイドメイン(文字列[]引数){ 犬の犬 = 新しい犬()。 dog.getBall(); // 发生空指针异常 System.out.println(dog.getBall()の長さ()。)。 // 解决方法 であれば(!犬= ヌル){ String型ボール = dog.getBall(); もし(!ボール= ヌル) のSystem.out.println(ball.length()); } } }
オプションを交換しました
パッケージ化ストリームを、 輸入javax.swing.text.html.Option。 輸入java.util.Optional; / ** * @autour ZDC * @Create 2020-03-25-01:00 * / パブリック クラス犬{ // 注意!!! プライベートオプション<文字列>ボール= Optional.empty(); パブリック犬(){ } 公共犬(オプションの<string> ボール){ この .ball = ボール。 } パブリックオプションの<string> getBall(){ 戻りボール。 } 公共の 静的な 無効メイン(文字列[]引数){ オプション <犬>犬= Optional.ofNullable(NULL )。 文字列s = dog.orElse(新しい犬())getBall()orElse( "默认的球"。。); System.out.println(S); } }