gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:12:57 24 4
gpt4 key购买 nike

我正在尝试迁移到 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 版本中执行相同的操作,另请参阅 What is the “execute around” idiom (感谢 gustafc 提供链接)。更简单的是 Java 8 为您提供了一个现有的 Function interface并且您可以使用 lambda expression 实现该接口(interface)而不是必须求助于匿名内部类或类似的东西。

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

关于java - 将方法作为参数传递——这可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30841892/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com