gpt4 book ai didi

java - 如何声明函数参数以接受抛出的函数?

转载 作者:IT老高 更新时间:2023-10-28 13:42:38 25 4
gpt4 key购买 nike

我在 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

如何定义我的函数参数以接受抛出的函数?

最佳答案

问题是Java有checked exceptions但 Kotlin 没有。 requestFunc 参数类型() -> List<Widget>将映射到功能接口(interface)Function0<List<Widget>>但运营商 invoke在 Kotlin 代码中不会引发检查异常。

所以你不能调用getStaticWidgets()在 lambda 表达式中,因为它抛出 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);

关于java - 如何声明函数参数以接受抛出的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45864571/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com