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(); }); }