传递方法作为参数 - 这可能吗?

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)请参阅教程中的方法引用

  • 相关:[什么是"执行"成语?](http://stackoverflow.com/questions/341971/what-is-the-execute-around-idiom) (2认同)