函数式接口作为参数,lambda,内部类

案例

前面学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;
    }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值