通过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(); } }}
效果:
3、处理逻辑:
在Test
类中,有一个List集合大小为10000,有一个解析类MyConsumer
,负责对List数据进行解析操作,并且将解析的数据插入到数据库中,但是为了防止数据一次插入的数据过多需要分批次插入,所以MyConsumer
负责解析,并且每解析1000条数据就回调Test
类,由Test
类负责插入数据到数据库中。
4、注意:
此处只是列举了,通过Consumer
实现数据解析的回调,实际开发中还是存在其他的情况,一样可以使用到Consumer
回调机制。