Lists.partition(List<T> list, int size)集合分组函数总结

Lists.partition(List<T> list, int size)这个函数有什么用途呢?

这里我给大家列举一例:比如我们系统中有一个批量导入的接口,由于数据量很大,写入数据库很耗时,导致这个接口是用不了【TimeOutException】

怎么解决呢?

我们脑海里立即会想到多线程去处理,一堆砖块让多个worker去搬,效率更高些,那问题来了,每个worker搬多少砖呢?这就用到我们这次说的Lists.partition函数

Lists.partition函数由很多公司或者组织进行封装jar,比如:

1.com.google.guava

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>25.0-jre</version>
</dependency>

2.apache.commons.collection

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-collections4</artifactId>
    <version>4.4</version>
</dependency>

3.Java8 stream流 partition by , partitioningBy是一种特殊的分组,只会分成两组

  lists.stream().collect(Collectors.partitioningBy())

当然我们也可以自己写算法区分割分组

集合分组【这里用apache的封装】后多线程去写入数据实践:

// 线程池
private static final ExecutorService executor = new ThreadPoolExecutor(10, 20, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>()); 
// 这里以10条数据为一组
List<List<OrderInfo>> partition = ListUtils.partition(oiList, oiList.size() % 10 == 0 ? oiList.size() / 10 : oiList.size() / 10 + 1);
CountDownLatch cdl = new CountDownLatch(partition.size());
for (List<OrderInfo> list : partition){
    executor.execute(()->{
        // 插入数据到数据库表
        orderInfoMapper.insertBatchInfo(list);
        cdl.countDown();
    });
}

 

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值