inside handling exceptions catch java error-handling lambda java-8 checked-exceptions

handling - throw exception inside lambda java



Lanzar excepción de lambda (3)

El problema es, de hecho, que todas las @FunctionalInterface s utilizadas en lambdas no permiten lanzar excepciones, salvo excepciones no verificadas.

Una solución es usar un paquete mío ; con él, tu código puede leer:

sessions.parallelStream() .map(Session::getBasicRemote) .forEach(Throwing.consumer(basic -> basic.sendText(message))); return this;

Esta pregunta ya tiene una respuesta aquí:

Dado este código java 8

public Server send(String message) { sessions.parallelStream() .map(Session::getBasicRemote) .forEach(basic -> { try { basic.sendText(message); } catch (IOException e) { e.printStackTrace(); } }); return this; }

¿cómo podemos hacer que esta IOException sea ​​delegada en la pila de la llamada al método? (En pocas palabras, ¿cómo hacer que este método arroje esta IOException ?)

Lambdas en Java no se ve muy amigable con el manejo de errores ...


Escribí una extensión a Stream API que permite lanzar excepciones marcadas.

public Server send(String message) throws IOException { ThrowingStream.of(sessions, IOException.class) .parallelStream() .map(Session::getBasicRemote) .forEach(basic -> basic.sendText(message)); return this; }


Mi enfoque sería arrojarlo furtivamente de la lambda, pero tenga cuidado de que el método de send declare en su cláusula throws . Usando la clase Exceptional que publiqué aquí :

public Server send(String message) throws IOException { sessions.parallelStream() .map(Session::getBasicRemote) .forEach(basic -> Exceptional.from(() -> basic.sendText(message)).get()); return this; }

De esta forma haces que el compilador "desvíe" un poco, inhabilitando la comprobación de excepciones en un punto de tu código, pero al declarar la excepción en tu método de send , restauras el comportamiento habitual de todas las personas que llaman.