0
点赞
收藏
分享

微信扫一扫

通过Consumer函数式接口,实现回调

小亦同学321 2022-02-23 阅读 66

比如有场景:A类服务List集合传入到Consumer接口中,Consumer接口实现批量解析List,当解析一定数量后,回调A类中的方法,进行下一步操作(比如加入数据库)。

代码定义如下:

1、Test类:

public class Test {
    public static void main(String[] args) throws Exception {
        test();
    }

    public static void test() throws Exception {
        // 模拟数据
        List<User> userList = new ArrayList<>();
        for (int a = 0; a < 10000; a++) {
            User user = new User();
            user.setUsername("用户:" + a);
            userList.add(user);
        }

        Consumer<List<User>> consumer =
                uploadData -> importData(uploadData);
        // 调用B类
        new MyConsumer(consumer).handlerData(userList);
    }


    /**
     * 创建回调方法
     */
    public static void importData(List<User> list) {
        // 插入到数据库中
        System.out.println("解析数量:" + list.size());
    }
}

2、MyConsumer类

public class MyConsumer<T> {

    /**
     * 传入解析数据的service对象
     */
    public Consumer<List<T>> uploadService;


    public MyConsumer(Consumer<List<T>> uploadService) throws Exception {
        this.uploadService = uploadService;
    }

    /**
     * 处理数据
     */
    public void handlerData(List<T> list) {
        // 模拟解析,每30条数据就进行回调
        List<T> dataList = new ArrayList<>();
        for (T t : list) {
            dataList.add(t);
            if (dataList.size() == 1000) {
                // 回调保存数据
                saveData(dataList);
            }
        }

        // 回调保存数据
        saveData(dataList);
    }


    /**
     * 回调保存数据
     *
     * @param dataList
     */
    private void saveData(List<T> dataList) {
        if (dataList.size() > 0) {
            uploadService.accept(dataList);
            dataList.clear();
        }
    }
}

效果:
在这里插入图片描述

3、处理逻辑:
Test类中,有一个List集合大小为10000,有一个解析类MyConsumer,负责对List数据进行解析操作,并且将解析的数据插入到数据库中,但是为了防止数据一次插入的数据过多需要分批次插入,所以MyConsumer负责解析,并且每解析1000条数据就回调Test类,由Test类负责插入数据到数据库中。

4、注意:
此处只是列举了,通过Consumer实现数据解析的回调,实际开发中还是存在其他的情况,一样可以使用到Consumer回调机制。

举报

相关推荐

0 条评论