¿Cómo declaro un parámetro de function para aceptar funciones que arrojan?

Definí una function en Kotlin:

fun convertExceptionToEmpty(requestFunc: () -> List<Widget>): Stream<Widget> { try { return requestFunc().stream() } catch (th: Throwable) { // Log the exception... return Stream.empty() } } 

Definí un método Java con esta firma:

 List<Widget> getStaticWidgets() throws IOException; 

Intento componerlos así:

 Stream<Widget> widgets = convertExceptionToEmpty(() -> getStaticWidgets()) 

Cuando compilo obtengo este error:

Error: (ln, col) java: exception no reportada java.io.IOException; debe ser atrapado o declarado arrojado

¿Cómo defino los parameters de mi function para aceptar una function que arroja?

    El problema es que Java ha verificado excepciones, pero Kotlin no. El tipo de parámetro requestFunc () -> List<Widget> se asignará a la interfaz funcional Function0 <List <Widget >> pero la invocación del operador no arroja una exception marcada en el código de Kotlin.

    Por lo tanto, no puede llamar a getStaticWidgets() en la expresión lambda ya que arroja una IOException que es una exception comprobada en Java.

    Como usted controla tanto el código de Kotlin como el código de Java, la solución más simple es cambiar el tipo de parámetro () -> List<Widget> a () -> List<Widget> Callable<List<Widget>> , por ejemplo:

     // 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() } } 

    Luego puede usar la Expresión de reference de método en Java8 como más, por ejemplo:

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

    Me temo que no hay nada que puedas hacer sino captar esa exception:

      Stream<Integer> widgets = convertExceptionToEmpty(() -> { try { return getStaticWidgets(); } catch (IOException e) { e.printStackTrace(); } return null; });