java – 传递方法作为参数 – 这是可能吗?

前端之家收集整理的这篇文章主要介绍了java – 传递方法作为参数 – 这是可能吗?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图迁移到 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中有可能有一个打开和关闭方法,并且采用我的代码的其余部分执行它的功能吗?

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

解决方法

因为你想表达一个在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接口,您可以使用lambda expression实现该接口,而不必使用匿名内部类或类似的内部类.

如果您所需的操作由单个方法调用组成,并且不需要类型转换,则可以将其实现为类似doWithSession(Session :: methodName)的方法引用,请参阅Method References in the tutorial

猜你在找的Java相关文章