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

时间:2015-06-15 09:38:01

标签: 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;
}

此处所有方法都重复使用相同的锅炉板sessionFactory.opensession.close

在Java 8中是否有可能有一个方法可以打开和关闭并获取一个函数,这是我的代码的其余部分并在中间执行它?

如果是这样 - 这个过程的名称是什么,或者任何人都可以提供一些如何实现这一目标的帮助

1 个答案:

答案 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