数据量大的 List中,如果要操作数据库 ,可以分批次,比如一次500的数据

 public static void main(String[] args) {

        //数据模拟
        List<ReceiptMethodIdAndNameBean> paperNoList = new ArrayList();
        for (int i = 0; i < 1000; i++) {
            ReceiptMethodIdAndNameBean selectItemBean = new ReceiptMethodIdAndNameBean();
            selectItemBean.setLockboxId(String.valueOf(i));
            paperNoList.add(selectItemBean);

        }

        //一次500条
        int number = 500;
        int limit = (paperNoList.size() + number - 1) / number;
        //分成limit次发请求到数据库,in()操作时   可以把多条数据分割成多组请求
        Stream.iterate(0, n -> n + 1).limit(limit).forEach(a -> {
            //获取后面1000条中的前500条
            // 拿到这个参数的流的 (a * applyIdSelectSize)后面的数据  .limit(applyIdSelectSize)->后面数据的500条  .collect(Collectors.toList()->组成一个toList
            List<ReceiptMethodIdAndNameBean> paperEntityList = paperNoList.stream().skip(a * number).limit(number).collect(Collectors.toList());
            //doSomething();  eg:数据库操作
            //举例分批输出
            for (ReceiptMethodIdAndNameBean receiptMethodIdAndNameBean : paperEntityList) {
                System.out.println(receiptMethodIdAndNameBean.getLockboxId());
            }
            System.out.println("======================================================");
        });

    }

使用google guava对List进行分割

 public static void main(String[] args) {

            //模拟模拟
            List<Integer> listDemo = Arrays.asList(1, 2, 3, 4, 5, 6, 7);

            List<List<Integer>> partition = Lists.partition(listDemo, 3);

            partition.stream().forEach(list -> {
                System.out.println("-------------------------");
                list.stream().forEach(a -> {
                    System.out.println(a);
                });
            });
        }

使用apache common collection

List<Integer> intList = Lists.newArrayList(1, 2, 3, 4, 5, 6, 7, 8);
List<List<Integer>> subs = ListUtils.partition(intList, 3);
Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐