Bの順によってグループから、B、合計()、平均()、MAX()を選択し、単一のテーブルを達成するために、SQL jdk8ストリーム、B限界MはNとプロパティをオフセット

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

おすすめ

転載: www.cnblogs.com/zhjh256/p/11619840.html