分批执行工具类

适合于分批获取数据,分批执行。比如一些接口比较耗时,可以将参数列表分成几次调用。

package com.tgb.hz.utils;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.ArrayUtils;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Function;

/**
 * 分批执行工具类
 *
 * Created by hezhao on 2019/1/18 20:27
 */
public class PartInvokeUtil {

    /**
     * 分批获取结果集
     * @param invoke 执行函数
     * @param ids id集合
     * @param limit 一批最大查询的次数
     * @param <P> id
     * @param <V> 结果
     * @return 结果集
     */
    public static <P,V> List<V> partGet(Function<List<P>, List<V>> invoke, List<P> ids, int limit) {
        if (CollectionUtils.isEmpty(ids)) {
            return new ArrayList<>();
        }
        int size = ids.size();
        List<V> list = new ArrayList<>();
        List<P> subIds;
        if (size > limit) {
            int count = size / limit;
            if (size % limit != 0) count += 1;
            int length = 0;
            for (int i = 0; i < count; i++) {
                if (i == count - 1) {
                    limit = size - (i * limit);
                }
                subIds = ids.subList(length, length + limit);
                length += limit;
                if (CollectionUtils.isEmpty(subIds)) {
                    break;
                }
                list.addAll(invoke.apply(subIds));
            }
        } else {
            list.addAll(invoke.apply(ids));
        }
        return list;
    }

    /**
     * 分批获取结果集
     * @param invoke 执行函数
     * @param ids id数组
     * @param limit 一批最大查询的次数
     * @param <P> id
     * @param <V> 结果
     * @return 结果集
     */
    public static <P,V> List<V> partGet(Function<P[], List<V>> invoke, P[] ids, int limit) {
        if (ArrayUtils.isEmpty(ids)) {
            return new ArrayList<>();
        }
        int size = ids.length;
        List<V> list = new ArrayList<>();
        P[] subIds;
        if (size > limit) {
            int count = size / limit;
            if (size % limit != 0)  count += 1;
            int length = 0;
            for (int i = 0; i < count; i++) {
                if (i == count - 1) {
                    limit = size - (i * limit);
                }
                subIds = Arrays.copyOfRange(ids, length, length + limit);
                length += limit;
                if (ArrayUtils.isEmpty(subIds)) {
                    break;
                }
                list.addAll(invoke.apply(subIds));
            }
        } else {
            list.addAll(invoke.apply(ids));
        }
        return list;
    }

    /**
     * 分批执行
     * @param invoke 执行函数
     * @param rows 结果集集合
     * @param limit 一批最大执行的次数
     * @param <T> 结果
     */
    public static <T> void partInvoke(Consumer<List<T>> invoke, List<T> rows, int limit) {
        if (CollectionUtils.isEmpty(rows)) {
            return;
        }
        int size = rows.size();
        List<T> subRows;
        if (size > limit) {
            int count = size / limit;
            if (size % limit != 0) count += 1;
            int length = 0;
            for (int i = 0; i < count; i++) {
                if (i == count - 1) {
                    limit = size - (i * limit);
                }
                subRows = rows.subList(length, length + limit);
                length += limit;
                if (CollectionUtils.isEmpty(subRows)) {
                    break;
                }
                invoke.accept(subRows);
            }
        } else {
            invoke.accept(rows);
        }
    }

    /**
     * 分批执行
     * @param invoke 执行函数
     * @param rows 结果集数组
     * @param limit 一批最大执行的次数
     * @param <T> 结果
     */
    public static <T> void partInvoke(Consumer<T[]> invoke, T[] rows, int limit) {
        if (ArrayUtils.isEmpty(rows)) {
            return;
        }
        int size = rows.length;
        T[] subRows;
        if (size > limit) {
            int count = size / limit;
            if (size % limit != 0) count += 1;
            int length = 0;
            for (int i = 0; i < count; i++) {
                if (i == count - 1) {
                    limit = size - (i * limit);
                }
                subRows = Arrays.copyOfRange(rows, length, length + limit);
                length += limit;
                if (ArrayUtils.isEmpty(subRows)) {
                    break;
                }
                invoke.accept(subRows);
            }
        } else {
            invoke.accept(rows);
        }
    }

    /**
     * 分批执行
     * @param invoke 执行函数
     * @param invokeModel 执行参数,结果集和Id集合
     * @param limit 一批最大执行的次数
     * @param <P> id
     * @param <V> 结果
     */
    public static <P, V> void partInvoke(Consumer<InvokeModel<P, V>> invoke, InvokeModel<P, V> invokeModel, int limit) {
        if (invokeModel == null || CollectionUtils.isEmpty(invokeModel.getRows()) || ArrayUtils.isEmpty(invokeModel.getIds())) {
            return;
        }
        P[] ids = invokeModel.getIds();
        int size = ids.length;
        if (size > limit) {
            int count = size / limit;
            if (size % limit != 0)  count += 1;
            int length = 0;
            for (int i = 0; i < count; i++) {
                if (i == count - 1) {
                    limit = size - (i * limit);
                }
                P[] subIds = Arrays.copyOfRange(ids, length, length + limit);
                length += limit;
                invokeModel.setIds(subIds);
                if (ArrayUtils.isEmpty(invokeModel.getIds())) {
                    break;
                }
                invoke.accept(invokeModel);
            }
        } else {
            invoke.accept(invokeModel);
        }
    }

    /**
     * 分批请求实体
     * @param <P> id
     * @param <V> 结果
     */
    public static class InvokeModel<P, V> {
        /** id数组 */
        private P[] ids;
        /** 结果集 */
        private List<V> rows;

        public P[] getIds() {
            return ids;
        }

        public void setIds(P[] ids) {
            this.ids = ids;
        }

        public List<V> getRows() {
            return rows;
        }

        public void setRows(List<V> rows) {
            this.rows = rows;
        }
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值