繁体   English   中英

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

[英]Passing method as a parameter - Is this possible?

我正在尝试迁移到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中是否有可能有一个方法来执行打开和关闭并获取一个函数,这是我的代码的其余部分并在中间执行它?

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

由于您希望表达适用于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版本中执行相同的操作,另请参阅什么是“执行”惯用法 (感谢gustafc的链接)。 更简单的是Java 8为您提供了一个现有的Function interface ,您可以使用lambda表达式实现该接口,而不必诉诸匿名内部类或类似的东西。

如果所需操作包含单个方法调用且不需要类型转换,则可以将其实现为方法引用,如doWithSession(Session::methodName) ,请参阅教程中的方法引用

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM