Java 8:Lambda表达式与自动关闭
如果您通過(guò)Neo4j的Java API和Java 6使用了Neo4j的早期版本,則可能具有與以下類(lèi)似的代碼,以確保在事務(wù)中進(jìn)行寫(xiě)操作:
在Neo4j 2.0中,Transaction開(kāi)始擴(kuò)展AutoCloseable ,這意味著您可以使用“嘗試使用資源”,并且在塊完成時(shí)將自動(dòng)調(diào)用“ 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();}} }盡管人們?cè)诓皇褂么苏Z(yǔ)法的情況下仍可以在應(yīng)用程序中掛起事務(wù),但這仍然可以很好地工作,盡管仍然可以允許使用舊樣式。
在Venkat Subramaniam的Java 8書(shū)中,他提出了一種替代方法,其中我們使用基于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();}}} }實(shí)際上,“ withinTransaction”函數(shù)將在GraphDatabaseService或類(lèi)似數(shù)據(jù)庫(kù)上運(yùn)行,而不是在該Db類(lèi)上,但是對(duì)于此示例,將其放置在該函數(shù)上更容易。
這種風(fēng)格的一個(gè)缺點(diǎn)是,您沒(méi)有對(duì)處理失敗案例的事務(wù)有明確的控制權(quán)–假設(shè)如果未調(diào)用'tx.success()',則事務(wù)失敗并將其回滾。 我不確定到底有多少用例真正需要這種細(xì)粒度的控制。
Brian Hurt將此稱(chēng)為“ 中間模式的漏洞 ”,我想一旦Java 8發(fā)布并得到更廣泛的使用,我們將開(kāi)始看到更多類(lèi)似的代碼。
翻譯自: https://www.javacodegeeks.com/2014/03/java-8-lambda-expressions-vs-auto-closeable.html
總結(jié)
以上是生活随笔為你收集整理的Java 8:Lambda表达式与自动关闭的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: JavaFX自定义控件– Nest Th
- 下一篇: 今年全球智能手机CIS出货量约为43亿个