2016-06-08 21 views
0

Sonar erwähnt, dass dieser Java-Code mit Lambda verwendet werden sollte, aber ich habe nie Lamdas verwendet und habe keine Ahnung, wie man es verwendet. Kann mir jemand auf die richtige Version dieses Codes hinweisen :?Java 8 und Lambdas im Shutdown Hook

Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() { 

    @Override 
    public void run() { 
     closeable.close(); 
     logger.info("Close closeable."); 
     executorPool.shutdown(); 
     logger.info("Shutdown executorPool"); 
    } 
})); 
+1

Dann lesen Sie bitte die Lambda-Tutorial: https://docs.oracle.com/javase/tutorial/java/javaOO/lambdadexpresstions.html – Tunaki

+2

In Fall, e xecutorPool 'bezieht sich auf einen Executor-Dienst wie' ThreadPoolExecutor', der 'shutdown()' darauf in einem JVM-Shutdown-Hook aufruft, macht wenig Sinn, da 'shutdown()' nur * ein Herunterfahren des Thread-Pools einleitet, egal hat eine Chance zu vervollständigen (oder überhaupt Fortschritte machen), bevor die JVM alle Threads auf die harte Tour tötet, ist unvorhersehbar. Nicht, dass die Threads manuell beendet werden müssten, bevor die JVM sie automatisch beendet ... – Holger

+0

Sie haben Recht. Wenn Sie einen Executor-Service verwenden, ist es sinnvoller, shutdownNow zu verwenden, aber ich verwende eine andere Klasse, und die Benennung könnte für den Leser irreführend sein. – hiaclibe

Antwort

5

einfach ersetzen new Runnable() mit () ->

Runtime.getRuntime().addShutdownHook(new Thread(() -> { 
    closeable.close(); 
    logger.info("Close closeable."); 
    executorPool.shutdown(); 
    logger.info("Shutdown executorPool"); 
})); 

Runnable ist eine funktionelle Schnittstelle, die bedeutet, dass es nur eine abstrakte Methode hat, so kann er mit einem Lambda-Ausdruck ersetzt werden, die Art von Funktionalität als kann als Argument übergeben werden

+0

Wow sehr schnell. Vielen Dank. – hiaclibe