2016-11-18 5 views
-2
public Resposne some_function(){ 
Response resp = null; 
try{ 
      resp = Response.ok().type(APPLICATION_ZIP).entity((StreamingOutput) out -> { 
       //Some code here. 
      }).header(CONTENT_DISPOSITION_HEADER, "ABC").build(); 
}catch() 
{ 
} 
return resp. 
} 

Hallo zurück,Lambda wird nicht ausgewertet, bis Funktion

ich eine ähnliche Funktion wie der oben haben. Das an die Entitätsfunktion übergebene Lambda wird erst ausgewertet, wenn die Funktion some_function zurückkehrt. Sieht aus wie Java 8-Funktion. Irgendwelche Hinweise auf was könnte passieren? Gibt es auch eine Möglichkeit, die Evaluierung zu erzwingen? Vielen Dank.

+0

Wann sollte das Lambda bewertet werden? –

+0

Das Lambda ist nur ein Objekt, das an die Entity-Methode übergeben wurde. Wann es ausgewertet wird, hängt davon ab, was die Entity-Methode damit macht. Es gibt keine Möglichkeit (im Allgemeinen), die Ausführung an Ort und Stelle zu erzwingen. Wenn Sie möchten, dass es sofort ausgeführt wird, fügen Sie den Code vor dem Aufruf ein, anstatt ihn als Lambda zu übergeben. – Jesper

+0

Dies wird nicht speziell ausgeführt, wenn die Funktion zurückkehrt, sondern nur von der aufrufenden Funktion ausgeführt wird. – Will

Antwort

1

Vermutlich sind Sie die JAX-RS ResponseBuilder-Typ. Es hat eine entity Methode, die eine Object akzeptiert. Diese Methode

Legen Sie die Antworteinheit im Builder fest.

Jede Instanz des Java-Typs für eine Antworteinheit, die von der Laufzeit unterstützt wird, kann übergeben werden.

Sie haben es ein StreamingOutput Objekt übergeben.

Ein Typ, der als Ressourcen Methode Rückgabewert oder als Entität in einem Response verwendet werden kann, wenn die Anwendung wünscht, um die Ausgabe zu streamen. Dies ist eine leichte Alternative zu einer javax.ws.rs.ext.MessageBodyWriter.

JAX-RS hat Ihre Ressource Methode, some_function(), genannt und wird ein Response Objekt erhält im Gegenzug. Wenn es das hat, wird es versuchen, es zu serialisieren. Intern hat Ihre JAX-RS-Implementierung wahrscheinlich einen Handler, der weiß, wie StreamingOutput Entities verarbeitet werden. Alles, was es zu tun hat, ist seine write Methode aufzurufen.


Lambda Expressions Auswertung besteht eine Instanz der entsprechenden Funktionsschnittstelle zu schaffen. In Ihrem Beispiel hat kein Code , aber hat die Methode der funktionalen Schnittstelle aufgerufen. JAX-RS wird schließlich.

+0

Vielen Dank. Sehr überzeugend – KiranCK

Verwandte Themen