java – 如何声明一个函数参数来接受抛出的函数?

前端之家收集整理的这篇文章主要介绍了java – 如何声明一个函数参数来接受抛出的函数?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我在Kotlin中定义了一个函数
  1. fun convertExceptionToEmpty(requestFunc: () -> List<Widget>): Stream<Widget> {
  2. try {
  3. return requestFunc().stream()
  4. } catch (th: Throwable) {
  5. // Log the exception...
  6. return Stream.empty()
  7. }
  8. }

我已经使用此签名定义了一个Java方法

  1. List<Widget> getStaticWidgets() throws IOException;

我试图像这样组成它们:

  1. 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参数type() – >列表与LT;窗口小部件>将映射到功能接口 Function0<List<Widget>>,但运算符 invoke不会在Kotlin代码中抛出已检查的异常.

因此,您无法在lambda表达式中调用getStaticWidgets(),因为它会抛出IOException,这是Java中的已检查异常.

由于您同时控制Kotlin和Java代码,最简单的解决方案是更改参数类型() – >列表与LT;窗口小部件>至Callable< List< Widget>>,例如:

  1. // change the parameter type to `Callable` ---v
  2. fun convertExceptionToEmpty(requestFunc: Callable<List<Widget>>): Stream<Widget> {
  3. try {
  4. // v--- get the `List<Widget>` from `Callable`
  5. return requestFunc.call().stream()
  6. } catch (th: Throwable) {
  7. return Stream.empty()
  8. }
  9. }

然后,您可以在Java8中进一步使用方法引用表达式,例如:

  1. Stream<Widget> widgets = convertExceptionToEmpty(this::getStaticWidgets);
  2.  
  3. //OR if `getStaticWidgets` is static `T` is the class belong to
  4. // v
  5. Stream<Widget> widgets = convertExceptionToEmpty(T::getStaticWidgets);

猜你在找的Java相关文章