Bis*_*128 9 java lambda java-8
我正在尝试迁移到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;
}
Run Code Online (Sandbox Code Playgroud)
这里使用相同的锅炉板sessionFactory.open并对session.close所有方法重复.
在Java 8中是否有可能有一个方法来执行打开和关闭并获取一个函数,这是我的代码的其余部分并在中间执行它?
如果是这样 - 这个过程的名称是什么,或者任何人都可以提供一些如何实现这一目标的帮助
Hol*_*ger 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();
}
}
Run Code Online (Sandbox Code Playgroud)
然后你就可以使用它:
@Override
@SuppressWarnings("unchecked")
public List<Group> getGroups()
{
return doWithSession(session -> (List<Group>)session.createQuery("from Group").list());
}
Run Code Online (Sandbox Code Playgroud)
这不是一种特殊的Java 8技术.您可以在早期的Java版本中执行相同的操作,另请参阅什么是"执行"惯用法(感谢gustafc的链接).更简单的是Java 8为您提供了一个现有的,您可以使用lambda表达式实现该接口,而不必诉诸匿名内部类或类似的东西.Function interface
如果所需操作包含单个方法调用且不需要类型转换,则可以将其实现为方法引用,如doWithSession(Session::methodName)请参阅教程中的方法引用
| 归档时间: |
|
| 查看次数: |
3320 次 |
| 最近记录: |