如果您通过Neo4j的Java API和Java 6使用了Neo4j的早期版本,则可能具有与以下类似的代码,以确保在事务中进行写操作:

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 );Transaction tx = db.beginTx();try {db.createNode();tx.success();} finally {tx.close();}}
}

在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发布并得到更广泛的使用,我们将开始看到更多类似的代码。

参考: Java 8:Lambda表达式与Auto Closeable可以从Mark Needham博客博客上的JCG合作伙伴 Mark Needham获得。

翻译自: https://www.javacodegeeks.com/2014/03/java-8-lambda-expressions-vs-auto-closeable.html

Java 8:Lambda表达式与自动关闭相关推荐

  1. 10个Java 8 Lambda表达式经典示例

    Java 8 刚于几周前发布,日期是2014年3月18日,这次开创性的发布在Java社区引发了不少讨论,并让大家感到激动.特性之一便是随同发布的lambda表 达式,它将允许我们将行为传到函数里.在J ...

  2. Java 8 Lambda 表达式详解

    版权声明:本文由吴仙杰创作整理,转载请注明出处:https://segmentfault.com/a/1190000009186509 1. 引言 在 Java 8 以前,若我们想要把某些功能传递给某 ...

  3. Java 8 Lambda表达式-接口实现

    Java 8 Lambda表达式在只有一个方法的接口实现代码编写中,可以起到简化作用: (argument list) -> body 具体看Runnable接口的例子 public class ...

  4. 这是一个有趣的问题,Java 8 Lambda 表达式被编译成了什么?

    在了解了Java 8 Lambda的一些基本概念和应用后, 我们会有这样的一个问题: Lambda表达式被编译成了什么? 这是一个有趣的问题,涉及到JDK的具体的实现.本文将介绍OpenJDK对Lam ...

  5. Java 8 Lambda 表达式被编译成了什么?

    点击上方"朱小厮的博客",选择"设为星标" 后台回复"书",获取个gui 在了解了Java 8 Lambda的一些基本概念和应用后, 我们会 ...

  6. java 8 lambda表达式中的异常处理

    文章目录 简介 处理Unchecked Exception 处理checked Exception 总结 java 8 lambda表达式中的异常处理 简介 java 8中引入了lambda表达式,l ...

  7. 设计模式的Java 8 Lambda表达式–命令设计模式

    在本博客中,我将说明如何使用Java 8 Lambda表达式以函数式编程方式实现命令模式 . 命令模式的目的是将请求封装为对象,从而为具有不同请求,队列或日志请求的客户端参数化,并支持相应的操作. 命 ...

  8. Java 8 Lambda表达式的函数式编程– Monads

    什么是monad ?: monad是一种设计模式概念,用于大多数功能编程语言(如Lisp)或现代世界的Clojure或Scala中. (实际上,我会从scala复制一些内容.)现在,为什么它在Java ...

  9. 深入浅出 Java 8 Lambda 表达式

    摘要:此篇文章主要介绍 Java8 Lambda 表达式产生的背景和用法,以及 Lambda 表达式与匿名类的不同等.本文系 OneAPM 工程师编译整理. Java 是一流的面向对象语言,除了部分简 ...

  10. Java 8 Lambda表达式10个示例【存】

    PS:不能完全参考文章的代码,请参考这个文件http://files.cnblogs.com/files/AIThink/Test01.zip 在Java 8之前,如果想将行为传入函数,仅有的选择就是 ...

最新文章

  1. 左线性文法和右线性文法_线性代数期末考试复习资料
  2. PNAS:人工构建玉米极简微生物组
  3. 2018五大人工智能趋势,你知道多少?
  4. 使用淘宝的IP查询API实现IP地址省市展示
  5. excel怎么设置密码保护?Excel文件添加密码保护教程
  6. 成功解决WARNING:tensorflow:Variable += will be deprecated. Use variable.assign_add if you want assignmen
  7. python中json.dump() 和 json.dumps() 有那些区别?
  8. 添加gitignore文件后使其生效
  9. 手把手教你用C#做疫情传播仿真
  10. xshell 秘钥连接_如何使用PuTTY和xshell 分别远程连接linux,并配置秘钥认证
  11. 如何在读研读博的道路上迅速失败?
  12. 为什么女人喜欢有钱的男人?
  13. MLPNet的学习笔记
  14. php word 数学公式,如何在word中输入复杂的数学公式? 详细始末
  15. Python判断是否json是否包含一个key
  16. 电脑测试软件_科普丨电脑小白必看的显卡测试小技巧
  17. 基于visual Studio2013解决面试题之0504单链表逆序
  18. 斯坦纳树算法概述及习题
  19. java Google图片验证码_使用google.kaptcha来生成图片验证码的实现方法
  20. 【5G架构】5G 协议栈结构以及与OSI七层协议之间的关系

热门文章

  1. 在dialog中使用EditText键盘弹不起来的解决方法
  2. 阿里云服务器 window server tomcat启动 并且关闭window防火墙 配置8080端口开放还是没用
  3. super构造方法为什么给子类赋值_【Java学习 | Javase】super
  4. 转: 深入浅出-网络七层模型
  5. 网络——连接到server
  6. 优先队列——斐波那契堆(without source code)
  7. 一个会定时完成的任务(二)
  8. poj doubles_余数运算符在Java中用于Doubles
  9. 递归算法和迭代算法_Java中没有递归的二进制搜索–迭代算法
  10. java 函数式编程 示例_功能Java示例 第1部分–从命令式到声明式