我在Kotlin中定义了一个函数:
fun convertExceptionToEmpty(requestFunc: () -> List<Widget>): Stream<Widget> {
try {
return requestFunc().stream()
} catch (th: Throwable) {
// Log the exception...
return Stream.empty()
}
}
我已经使用此签名定义了一个Java方法:
List<Widget> getStaticWidgets() throws IOException;
我试图像这样组成:
Stream<Widget> widgets = convertExceptionToEmpty(() -> getStaticWidgets())
编译时我收到此错误:
错误:(ln,col)java:未报告的异常java.io.IOException;必须被抓住或宣布被抛出
如何定义我的函数参数以接受抛出的函数?
答案 0 :(得分:4)
问题是Java有checked exceptions但Kotlin没有。 requestFunc参数类型() -> List<Widget>
将映射到功能接口Function0<List<Widget>>,但运算符invoke不会在Kotlin代码中抛出已检查的异常。
因此,您无法在lambda表达式中调用getStaticWidgets()
,因为它会抛出IOException
,这是Java中的已检查异常。
由于您同时控制Kotlin和Java代码,因此最简单的解决方案是将参数类型() -> List<Widget>
更改为Callable<List<Widget>>
,例如:
// change the parameter type to `Callable` ---v
fun convertExceptionToEmpty(requestFunc: Callable<List<Widget>>): Stream<Widget> {
try {
// v--- get the `List<Widget>` from `Callable`
return requestFunc.call().stream()
} catch (th: Throwable) {
return Stream.empty()
}
}
然后您可以在Java8中进一步使用方法参考表达式,例如:
Stream<Widget> widgets = convertExceptionToEmpty(this::getStaticWidgets);
//OR if `getStaticWidgets` is static `T` is the class belong to
// v
Stream<Widget> widgets = convertExceptionToEmpty(T::getStaticWidgets);
答案 1 :(得分:0)
我担心除了这个例外,你无能为力:
Stream<Integer> widgets = convertExceptionToEmpty(() -> {
try {
return getStaticWidgets();
} catch (IOException e) {
e.printStackTrace();
}
return null;
});