我试图迁移到
java 8,并在我的dao类中有一些方法,执行以下操作
@Override @SuppressWarnings("unchecked") public List<Group> getGroups() { Session session = sessionFactory.openSession(); List<Group> allGroups = (List<Group>)session.createQuery("from Group").list(); session.close(); return allGroups; }
这里对于所有方法重复使用相同的锅炉板sessionFactory.open和session.close.
在Java 8中有可能有一个打开和关闭的方法,并且采用我的代码的其余部分执行它的功能吗?
如果是这样 – 这个过程的名称是什么,或者任何人都可以提供一些有关如何实现这一点的帮助
解决方法
因为你想表达一个在Session实例上工作的代码(所以你可以抽象出它的创建和清理),并且可以返回一个任意的结果,一个Function< Session,T>将是封装此类代码的正确类型:
public <T> T doWithSession(Function<Session,T> f) { Session session = sessionFactory.openSession(); try { return f.apply(session); } finally { session.close(); } }
那么你可以使用它:
@Override @SuppressWarnings("unchecked") public List<Group> getGroups() { return doWithSession(session -> (List<Group>)session.createQuery("from Group").list()); }
这不是一种特殊的Java 8技术.您可以在早期的Java版本中执行相同操作,另请参见What is the “execute around” idiom(感谢gustafc链接).更容易的是,Java 8为您提供了现有的Function
接口,您可以使用lambda expression实现该接口,而不必使用匿名内部类或类似的内部类.
如果您所需的操作由单个方法调用组成,并且不需要类型转换,则可以将其实现为类似doWithSession(Session :: methodName)的方法引用,请参阅Method References in the tutorial