JAVA/JDK 8+ 方法使用Function传参时对传入的Function的Exception处理问题 @FunctionalInterface

曾几何时,为了定义一个分发器作用的方法,我们要在代码中写入茫茫多的if/else来处理将方法如何转发到下一层接口

public void execute() {
    
    // do something

    if (conditionA) {
        methodA();
    } else if (conditionB) {
        methodB();
    } else if (conditionC) {
        methodC();
    }
    ...
    else {
        methodOther();
    }

    // do something
}

相信大家对这段代码都是极不满意的。好在JDK8中为我们提供了新增加的函数接口:

  • java.util.function

这样,我们可以将需要执行的方法直接传入本方法,极大的增强了我们的代码逻辑和简洁性。function中我们用的最多,适普性最强的一般是Function<T, Z>接口,该接口表示接受一个输入参数,返回一个结果的方法类型,因为输入、输出都是泛型,因而对不同的业务场景具有强大的适应能力。下文我们将以这个接口为例,function中其他接口的处理办法较为类似。

public void execute(Function<T,Z> func) {
    
    // do something

    T t = func.apply(z);

    // do something
}

这样,上层调用本层接口时可以直接指定本层的执行方法。但是,当考虑到实际业务场景时,这样的代码不一定能奏效。

其中的主要一个问题就是,在实际业务场景中,我们往往要遇到各类型的Exception。这其中有些是代码逻辑上的,有些是业务逻辑上的,我们需要在不同的调用层中处理这些异常,以维持整个业务的正常运转,同时给到使用者和运维人员足够的信息。有时我们会在本层方法中抛出这些异常留待上层解决,但是这时,Function接口就会出现问题。我们看一个简单的例子:下图是一个简单的Function使用案例,主函数调用print方法并传入out方法作为参数,一切正常

然而,如果被传入的参数out方法需要throws一些异常,此时这段代码就会报Unhandled exception错误,并且在调用函数上试图catch或继续throw这个异常也是无效的哟,见下图:

 这段代码是无法编译通过的。问题出在哪里?究其主要原因,Function只是一个代表方法的接口,我们在代码中调用了该接口定义的apply()方法执行传入的方法,而apply()方法是不处理异常的。

知道了问题后,处理方法就简单了。针对不同的业务场景,我们有两个办法可以具体处理该问题。如果Function接口入参的方法是我们自己定义的,则我们可以使用@FunctionalInterface注解重新定义一个会处理异常的function接口,并且调用该接口来解决问题。

 可以看到,这段代码可以编译并正常运行了。

如果传参的方法(即上图的print()方法)不是我们自己写的,我们仅仅只是该接口的调用方(谁提供接口留这么大一个坑,谴责!)那我们可以为我们的函数独立一个包装方法,在这个方法中处理好所有的异常,只留下运行时异常,然后再将该方法传入调用方法,如下图: 

 

这样我们可以解决使用Function传参时对传入的Function的Exception处理问题。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值