Java8のスキップと制限の使い方を学ぶ

特にバッチ挿入に mybatis を使用する場合、データのバッチ処理が必要になる場合があります。

学習をスキップ+制限する

1. Skip(long n) メソッドは、最初の n (負ではない) 要素をスキップし、残りのストリーム (空のストリームである可能性があります) を返します。

2.limit(long maxSize): メソッドは前の maxSize 要素を切り捨てます。元のストリームに含まれる要素の数が maxSize 未満の場合は、その要素をすべて取得します。

スキップ

    public static void main(String[] args) {
        skip();
    }

    // skip(long n) 方法跳过前 n (非负)个元素,返回剩下的流,有可能为空流。
    public static void skip() {
        List<String> names = Arrays.asList("ling", "lian", "yan", "feng", "yun", "wen", "tian", "lang", "xiu");
        String skipFirstName = names.stream().skip(0).findFirst().orElse("");
        System.out.println("skipFirstName: " + skipFirstName);
        String skipLastName = names.stream().skip(names.size() - 1).findFirst().orElse("");
        System.out.println("skipLastName: " + skipLastName);
        names = Collections.singletonList("yan");
        // 超出报错
        String penultName = names.stream().skip(names.size() - 2).findFirst().orElse("");
        System.out.println("reduce penultName: " + penultName);
    }

3 番目を超えると、エラーが報告されます。 

制限:

     public static void main(String[] args) {
        limit();
    }
 

    // limit(long n): 方法截断其前个n元素;若原流中包含的元素个数小于n,那就获取其所有的元素;
    public static void limit() {
        List<String> names = Arrays.asList("ling", "lian", "yan", "feng", "yun", "wen", "tian", "lang", "xiu");
        List<String> limit1 = names.stream().limit(5).collect(Collectors.toList());
        System.out.println("inner size: " + limit1);
        List<String> limit2 = names.stream().limit(25).collect(Collectors.toList());
        System.out.println("over size: " + limit2);
    }

結果:

inner size: [ling, lian, yan, feng, yun]
over size: [ling, lian, yan, feng, yun, wen, tian, lang, xiu]

バッチ処理をスキップ+制限する

    public static void main(String args[]) {
        List<Integer> datas = new ArrayList<>();
        for (int i = 0; i < 26; i++) {
            datas.add(i);
        }
        skipData2(datas, 5);
        System.out.println("===========");
        skipData2(datas, 6);
    }

    public static void skipData1(List<Integer> datas, int maxSize){
        int dataSize = datas.size();
        // 向上取整
//        int loop =  dataSize / maxSize + (dataSize % maxSize != 0 ? 1 : 0);
        int loop =(int) Math.ceil(dataSize * NumberUtils.DOUBLE_ONE / maxSize);
        List<Integer> skipData;
        for (int i = 0; i < loop; i++) {
            skipData = ListUtils.emptyIfNull(datas).stream().skip(i * maxSize).limit(maxSize).collect(Collectors.toList());
            System.out.println(skipData);
        }
    }

    public static void skipData2(List<Integer> datas, int maxSize){
        List<Integer> skipData;
        for (int offset = 0, listSize = datas.size(); offset < listSize; offset += maxSize) {
            skipData = datas.stream()
                    .skip(offset)
                    .limit(maxSize)
                    .collect(Collectors.toList());
            System.out.println(skipData);
        }
    }

結果:

[0, 1, 2, 3, 4]
[5, 6, 7, 8, 9]
[10, 11, 12, 13, 14]
[15, 16, 17, 18, 19]
[20, 21, 22, 23, 24]
[25]
===========
[0, 1, 2, 3, 4, 5]
[6, 7, 8, 9, 10, 11]
[12, 13, 14, 15, 16, 17]
[18, 19, 20, 21, 22, 23]
[24, 25]

最初の方法は、ページネーションの慣用的な方法により一致しています。

応用:

    mybatis がバッチ挿入に foreach を使用する場合、デフォルトのエグゼキュータ タイプは Simple であるため、ステートメントごとに新しい準備されたステートメントが作成されます。つまり、オブジェクトがPreparedStatement作成されます。私たちのプロジェクトでは、バッチ挿入メソッドが継続的に使用されます。MyBatis は含まれるステートメントのキャッシュを使用できないため、メソッドが呼び出されるたびに SQL ステートメントが再解析されます。さらに、PreparedStatement は非常に長く、多くのプレースホルダーが含まれているため、プレースホルダーとパラメーターのマッピングに特に時間がかかります。

        したがって、foreach を使用して挿入するのは、一度に 20 ~ 50 行を挿入するのが適切であり、時間の消費も許容範囲内です。このとき上記のバッチデータを使用します。

要約:

        スキップと制限の使用は、データのバッチ処理に適しています。

おすすめ

転載: blog.csdn.net/qq_35461948/article/details/130132239