Java 8:Lambda表达式与自动关闭
如果您通過Neo4j的Java API和Java 6使用了Neo4j的早期版本,則可能具有與以下類似的代碼,以確保在事務中進行寫操作:
在Neo4j 2.0中,Transaction開始擴展AutoCloseable ,這意味著您可以使用“嘗試使用資源”,并且在塊完成時將自動調用“ close”方法:
public class StylesOfTx {public static void main( String[] args ) throws IOException{String path = "/tmp/tx-style-test";FileUtils.deleteRecursively(new File(path));GraphDatabaseService db = new GraphDatabaseFactory().newEmbeddedDatabase( path );try ( Transaction tx = db.beginTx() ){Node node = db.createNode();tx.success();}} }盡管人們在不使用此語法的情況下仍可以在應用程序中掛起事務,但這仍然可以很好地工作,盡管仍然可以允許使用舊樣式。
在Venkat Subramaniam的Java 8書中,他提出了一種替代方法,其中我們使用基于lambda的方法:
public class StylesOfTx {public static void main( String[] args ) throws IOException{String path = "/tmp/tx-style-test";FileUtils.deleteRecursively(new File(path));GraphDatabaseService db = new GraphDatabaseFactory().newEmbeddedDatabase( path );Db.withinTransaction(db, neo4jDb -> {Node node = neo4jDb.createNode();});}static class Db {public static void withinTransaction(GraphDatabaseService db, Consumer<GraphDatabaseService> fn) {try ( Transaction tx = db.beginTx() ){fn.accept(db);tx.success();}}} }實際上,“ withinTransaction”函數將在GraphDatabaseService或類似數據庫上運行,而不是在該Db類上,但是對于此示例,將其放置在該函數上更容易。
這種風格的一個缺點是,您沒有對處理失敗案例的事務有明確的控制權–假設如果未調用'tx.success()',則事務失敗并將其回滾。 我不確定到底有多少用例真正需要這種細粒度的控制。
Brian Hurt將此稱為“ 中間模式的漏洞 ”,我想一旦Java 8發布并得到更廣泛的使用,我們將開始看到更多類似的代碼。
翻譯自: https://www.javacodegeeks.com/2014/03/java-8-lambda-expressions-vs-auto-closeable.html
總結
以上是生活随笔為你收集整理的Java 8:Lambda表达式与自动关闭的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JavaFX自定义控件– Nest Th
- 下一篇: Java 8 Friday Goodie