> 文档中心 > 通过Consumer函数式接口,实现回调

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

比如有场景: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(); }    }}

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

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

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