加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-14 05:41:41 所属栏目:Java 来源:网络整理
导读:我试图迁移到 java 8,并在我的dao类中有一些方法,执行以下操作 @Override@SuppressWarnings("unchecked")public ListGroup getGroups(){ Session session = sessionFactory.openSession(); ListGroup allGroups = (ListGroup)session.createQuery("from Grou
我试图迁移到 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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读