java - 将异常移到 Function/lambda 之外
问题描述
我知道如何处理功能接口中的异常,但我必须将异常移到我的 lambda 之外。(主要应该抛出 IOExc)
public static void main(String[] args) throws IOException {
Function<String,List<String>> flines = f->{
//reading from input stream, but i cant use try catch
}
}
我的新接口必须继承自 java.util.function。任何想法如何做到这一点?像这样的东西不好用
public interface MyFunction<T,R> extends Function<T,R> {
@Override
default R apply(T t) {
try {
return applyThrows(t);
}catch (Exception e){
throw new RuntimeException(e);
}
}
R applyThrows (T t) throws IOException;
解决方案
这里有两个方面:
- 正如 JB 所评论的那样,当您确实必须取回已检查的异常时,您的 lambda 可以将其包装到运行时异常中,并且外部代码可以捕获该异常并解开已检查的异常并重新抛出该异常。
- 但是,仅仅因为可以,就将语言强制构造为构造并不是一个好主意。如果核心设计点是处理 IO,而你有处理 IOExceptions 的需求,那么正确的做法是不要在这里使用 lambdas!
推荐阅读
- google-cloud-platform - Gcp ssh 问题。错误:- 连接被拒绝
- python - 为什么我不能从我的 Django 项目中的另一个应用程序中引用这个类?
- c++ - 不会显示所需输出的虚拟继承
- ios - 像这样的代码是否存在强保留问题:
- node.js - Express.js 连接超时与服务器超时
- excel - 尝试使用 VBA 访问 word doc 中的书签时出错-运行时错误“438”对象不支持此属性或方法
- assembly - 汇编代码到二进制转换问题'和,添加'
- mysql - 将来自闪亮小部件的输入和 MySQL 查询与更少的代码相结合
- sqlite - 如何将数据从 csv 文件附加到 sqlite?
- laravel - Laravel 和 Typeahead.js 自动完成搜索 [JS 错误]