比如有场景: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
回调机制。