2015-07-26 4 views
5

diesen Java-8 Code GegebenThrowing Ausnahme von Lambda

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

    return this; 
} 

wie richtig machen wir dies den Stapel des Methodenaufrufes delegiert werden IOException? (In aller Kürze, wie diese Methode machen diese IOException werfen?)

Lambdas in Java nicht sehr freundlich sehen Umgang mit dem Irrtum ...

Antwort

8

Mein Ansatz es sneakily Wurf vom Lambda sein würde, aber darauf achten, die send Methode es in seiner throws Klausel erklären zu lassen. Mit Hilfe der Exceptional Klasse I posted here:

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

Auf diese Weise sind Sie effektiv den Compiler zu machen „wegschauen“ für nur ein bisschen, zu deaktivieren seine Ausnahme an einer Stelle überprüft im Code, sondern die Ausnahme auf Ihrem send erklärt Mit dieser Methode stellen Sie das normale Verhalten für alle Aufrufer wieder her.

+1

Oh, jetzt mag ich das. Das ist in der Tat sehr hinterhältig. –

2

Das Problem ist in der Tat, dass alle @FunctionalInterface s in lambdas verwendet werden, keine Ausnahmen zulassen geworfen werden, außer für ungeprüfte Ausnahmen.

Eine Lösung verwendet a package of mine; mit ihm können Sie den Code lesen:

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

Wie lässt sich 'send' die Ausnahme werfen? –

+0

@MarkoTopolnik: Ich verstehe das. Aber ein ** viel ** mehr Arbeit ist erforderlich, um dann 'send' die 'IOException' zu werfen. Wenn ich mich nicht irre, muss man im Grunde die "ThrownByLambdaException" abfangen und dann eine Reihe von "instanceof" haben, um herauszufinden, was die eigentliche Ausnahme war, damit man sie erneut auslösen kann. Vielleicht nicht so schlimm für ein oder zwei Ausnahmen, aber immer noch ziemlich ausführlich. –

+0

@ T.J.Crowder Um fair zu unserem Kollegen fge zu bleiben (und wie du in unserem Chat herausgefunden hast), unterstützt 'lowing-lambdas' das hinterhältige Wurf-Idiom. –

5

I an die Stream-API, die es ermöglicht, dass überprüfte Ausnahmen ausgelöst werden.

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

    return this; 
} 
+0

danke, jetzt ist das wirklich nette Schnittstelle :) wird auf jeden Fall Ihren Quellcode überprüfen – vach

Verwandte Themen