案例
前面学stream流时提到过使用匿名内部类的写法调用方法
当时迷迷糊糊的,没去深究,结果这几天天天遇到,直接把自己搞晕。。。。
首先,调用了foreacharr方法,传入参数consumer,但是这个对象我们通过匿名内部类的方法创建,为什么这么做呢?因为可以不用在写一个类去实现接口,直接在foreacharr方法的参数里new一个匿名对象作为参数
什么是匿名内部类,如何使用匿名内部类
浅谈Java中的匿名对象
这个consumer参数所对应的类型为接口类型(下面这一大串整体作为我们调用foreachArr方法所需的一个参数,因为这个参数的类型要IntConsumer接口类型,我们如果要传入这种类型的参数,肯定要定义这个类型的对象然后传入,然后如果要义这种类型的对象,肯定要先定义这个类(因为没这个类)类实现该接口,因为这个接口中有一个方法,实现接口必须重写方法。所以需要重写里面的方法。直接定义要写很多代码,因此我们使用匿名定义该类型的参数。但是在new 匿名对象时同时要重写方法。
在foreachArr方法内部,调用了comsumer对象的accept方法,但是这个方法已经被我们重写了,因为我们需要完成打印功能,于是在重写方法时写好了我们自己的逻辑。
这就是接口作为参数的好处之一
所以我们按照正常顺序时先写个类实现接口,在new一个对象,把对象作为参数传入要调用的方法里。匿名内部类的写法只是偷懒而已,然后lambda的写法就更加的偷懒了。。。。
因为lambda用在函数式接口,可以非常省略。。。。。
参考连接:一文搞懂Java8 Lambda表达式(附视频教程)
使用接口作为参数的好处参考如下:
可以试一试能不能看懂下面的代码
平时这种写法接触的少,以为不常见。 结果最近老是看到,还挺不习惯。。
public R modelExcelImport(@RequestParam("fileName") MultipartFile file, HttpServletRequest request) {
return handle(request, (user, r) -> {
asyncImportService.batchUpdateModelMapping(file, user);
r = R.ok("文件异步上传完成,请等待后续执行过程");
return r;
});
}
public R handle(HttpServletRequest request, BusHandler busHandler) {
R r = R.ok();
//
//。。。。。。
return r;
}
public interface BusHandler {
R handle(UserTokenInfo user, R r) throws Exception;
}
还有这个例子,看来在工作中还是挺常见的
@Async("asyncServiceExecutor")
public void batchUpdate(MultipartFile file, UserTokenInfo user) throws Exception {
asyncExcelUpdate(file, null, (list) -> {
MappingService.batchUpdate(list, user);
});
}
private void asyncExcelUpdate(MultipartFile file, UserTokenInfo user, BatchExecutor executor) {
long start = System.currentTimeMillis();
log.warn(" =================================== 文件异步处理开始");
List dataList = null;
try {
dataList = ExcelUtil.parserExcel(file);
} catch (Exception e) {
log.error("",e);
}
log.warn(" =================================== 文件解析完成,耗时: {}ms", System.currentTimeMillis() - start);
long start1 = System.currentTimeMillis();
log.warn(" =================================== 开始异步处理");
try {
executor.exec(dataList);
} catch (Exception e) {
log.error("文件批量处理失败, error: {}", e);
log.error("",e);
}
log.warn(" =================================== 完成异步处理, 耗时: {}ms", System.currentTimeMillis() - start1);
}
interface BatchExecutor {
void exec(List list) throws Exception;
}