SQLデータベースの処理を使用して、この時間は(余りにネットワーク遅延)は必ずしも妥当しない場合に、時々単に単一のサブクエリの結果が、複数のデータソースをマージするので、シーンを測定するための理由が生じます。
試験データ100,000株は、結果が1000ライン
次のように遅延限度20は、オフセット0:
パッケージcom.hundsun.ta.base.service。 輸入com.hundsun.ta.utils.JsonUtils。 輸入lombok.AllArgsConstructor。 輸入lombok.NoArgsConstructor。 インポートのjava.math.BigDecimal; 輸入 java.utilの。* ; 輸入java.util.stream.Collectors。 インポート 静的 java.util.stream.Collectorsを*。; / ** * @authorのzjhua * @description * @date 2019年10月3日15:35 * / パブリック クラスJavaStreamCommonSQLTest { 公共 静的 ボイドメイン(文字列[]引数){ 一覧<人>人物= 新しい ArrayListを<> (); 以下のために(int型 I = 100000; I> 0; i-- ){ persons.add(新しい人物( "人" +(I + 1)%1000と、I 100%、私は1000%、新規のBigDecimal(I)、I )); } のSystem.out.println(のSystem.currentTimeMillis())。 地図 <文字列、地図<Integer型、データ>>結果= 。persons.stream()を収集( groupingBy(人::のgetName、Collectors.groupingBy(人:: getAge、 collectingAndThen(summarizingDouble(人:: getQuantity)、 DSS - > 新しいデータ((長い)dss.getAverage()、(長い)dss.getSum())))))。 一覧 <ResultGroup>リスト= 新しい ArrayListを<> (); result.forEach((K、V) - > { v.forEach((IK、IV) - > { ResultGroup電子 = 新しいResultGroup(K、IK、iv.average、iv.sum); list.add(E); }); }); list.sort(Comparator.comparing(ResultGroup :: getSum).thenComparing(ResultGroup :: getAverage)); list.subList( 0,20 )。 System.out.println(のSystem.currentTimeMillis())。 System.out.println(JsonUtils.toJson(リスト)); } } @ lombok.Data @ NoArgsConstructor @ AllArgsConstructor クラス人{ 文字列名。 int型のグループ。 int型の年齢; BigDecimalのバランス。 重量; } @ lombok.Data @ NoArgsConstructor @ AllArgsConstructor @Deprecated クラスResultGroup { 文字列名。 int型のグループ。 長期平均; 長い合計; } クラスデータ{ 長い平均。 長い合計; 公共データ(長い平均、長い合計){ この .average = 平均。 この .SUM = 合計。 } }
開始:1570093479002
終了:1570093479235 --200多くのミリ秒
試験データの100,000行、結果のライン90000
次のように遅延制限20は、10000をオフセット:
パッケージcom.hundsun.ta.base.service。 輸入com.hundsun.ta.utils.JsonUtils。 輸入lombok.AllArgsConstructor。 輸入lombok.NoArgsConstructor。 インポートのjava.math.BigDecimal; 輸入 java.utilの。* ; 輸入java.util.stream.Collectors。 インポート 静的 java.util.stream.Collectorsを*。; / ** * @authorのzjhua * @description * @date 2019年10月3日15:35 * / パブリック クラスJavaStreamCommonSQLTest { 公共 静的 ボイドメイン(文字列[]引数){ 一覧<人>人物= 新しい ArrayListを<> (); 以下のための(int型 ; I> 0 i-- I = 100000 {) persons.add(新しい?私は、私%1000:人( "人物" +(I + 1)%1000年、私は> 90000私は%10000 新しいですBigDecimalを(I)、I)); } のSystem.out.println(のSystem.currentTimeMillis())。 地図 <文字列、地図<Integer型、データ>>結果= 。persons.stream()を収集( groupingBy(人::のgetName、Collectors.groupingBy(人::のgetGroup、 collectingAndThen(summarizingDouble(人:: getQuantity)、 DSS - >新しいデータ((ロング)dss.getAverage()、(長い)dss.getSum()))))); 一覧 <ResultGroup>リスト= 新しい ArrayListを<> (); result.forEach((K、V) - > { v.forEach((IK、IV) - > { ResultGroup電子 = 新しいResultGroup(K、IK、iv.average、iv.sum); list.add(E); }); }); list.sort(Comparator.comparing(ResultGroup :: getSum).thenComparing(ResultGroup :: getAverage)); System.out.println(はlist.size())。 list.subList( 10000,10020 )。 System.out.println(のSystem.currentTimeMillis())。 System.out.println(JsonUtils.toJson(リスト)); } } @ lombok.Data @ NoArgsConstructor @ AllArgsConstructor クラス人{ 文字列名。 int型のグループ。 int型の年齢; BigDecimalのバランス。 重量; } @ lombok.Data @ NoArgsConstructor @ AllArgsConstructor @Deprecated クラスResultGroup { 文字列名。 int型のグループ。 長期平均; 長い合計; } クラスデータ{ 長い平均。 長い合計; パブリックデータ(長い平均、長い合計){ この .average = 平均。 この .SUM = 合計。 } }
開始:1570093823404
終了:1570093823758 --350多くのミリ秒
全体的に、今までの、Javaストリームは、直接統計によるマルチレベルマップの必要性(だけではなく、複雑な、低パフォーマンス)、およびグループをサポートしていない複数のフィールドで、このような典型的なグループとしてSQL低コストを、置き換えることはできません私はまた、別のクラスになる必要があります。開発コストが高すぎます。
参考ます。https://stackoverflow.com/questions/32071726/java-8-stream-groupingby-with-multiple-collectors