我正在尝试迁移到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中是否有可能有一个方法可以打开和关闭并获取一个函数,这是我的代码的其余部分并在中间执行它?
如果是这样 - 这个过程的名称是什么,或者任何人都可以提供一些如何实现这一目标的帮助
答案 0 :(得分:14)
由于您希望表达适用于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
interface
,并且您可以使用lambda expression实现该接口,而不必诉诸匿名内部类或类似内容。
如果您所需的操作包含单个方法调用且不需要类型转换,则可以将其实现为方法引用,如doWithSession(Session::methodName)
,请参阅Method References in the tutorial