首页 > 解决方案 > 大 ArrayList 分解成批次

问题描述

我有一个大小为 30K 的列表,我将它们分成 1000 个块,因为我需要使用子列表中的 id 来获取休息端点并做一些断言。我正在使用 jersey 客户端与其他端点交谈

ArrayList<String> ga1 = new ArrayList<>(Ids.subList(1,1000));
ArrayList<String> ga2 = new ArrayList<>(Ids.subList(1001,2000));
ArrayList<String> ga3 = new ArrayList<>(Ids.subList(2001,3000));
ArrayList<String> ga4 = new ArrayList<>(Ids.subList(3001,4000));
...
ArrayList<String> ga30 = new ArrayList<>(Ids.subList(29001,sizeOfTheOriginalList));

checkSubList(ga1);
{
    Assertions;
}

checkSubList(ga30);
{
    Assertions;
}

有没有更好的方法来拆分原始列表并获取子列表

标签: javalistjava-8

解决方案


该原则被称为“不要重复自己”。您的代码行有很多重复(for ga1, ga2, ec.

其他提示: - 不要将变量声明为ArrayList,将其声明为您关心的接口,List. - 变量Idsids符合 Java 标准。- 您可以使用subList而无需从中构建新ArrayList的。

这段代码表明了这一点。

import java.util.*;
import java.util.stream.*;

public class A {
    public static void main(String[] args) {
        int upperLimit = 30000;
        // Create ids in next line just to illustrate  a list of 30000 items
        List<String> ids = IntStream.range(0, upperLimit).mapToObj(x -> "" + x).collect(Collectors.toList());

        int step = 1000;
        for (int i = 0; i < upperLimit; i += step) {
            List<String> ga = ids.subList(i, i + step);
            checkSubList(ga);
        }
    }

    private static void checkSubList(List<String> ga) {
        //  implement this as you'd like
        System.out.println(ga);
    }
}

推荐阅读