如何声明函数参数以接受抛出的函数?
How do I declare a function parameter to accept functions that throw?
我在 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())
编译时出现此错误:
Error:(ln, col) java: unreported exception java.io.IOException; must be caught or declared to be thrown
如何定义我的函数参数以接受抛出的函数?
恐怕除了捕捉异常你别无他法:
Stream<Integer> widgets = convertExceptionToEmpty(() -> {
try {
return getStaticWidgets();
} catch (IOException e) {
e.printStackTrace();
}
return null;
});
问题是 Java checked exceptions but Kotlin does not. The requestFunc parameter type () -> List<Widget>
will be mapped to the functional interface Function0<List<Widget>> but the operator 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);
我在 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())
编译时出现此错误:
Error:(ln, col) java: unreported exception java.io.IOException; must be caught or declared to be thrown
如何定义我的函数参数以接受抛出的函数?
恐怕除了捕捉异常你别无他法:
Stream<Integer> widgets = convertExceptionToEmpty(() -> {
try {
return getStaticWidgets();
} catch (IOException e) {
e.printStackTrace();
}
return null;
});
问题是 Java checked exceptions but Kotlin does not. The requestFunc parameter type () -> List<Widget>
will be mapped to the functional interface Function0<List<Widget>> but the operator 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);