java - java中是否有用于hibernate中延迟获取的yield return?

标签 java

据我所知,“ yield 返回”(C# 构造)在 Java 中不可用。但是,当我在 Java/Hibernate 中进行延迟加载时。使用延迟加载和类似于yield return 的方法来迭代集合的推荐方法是什么?

最佳答案

Java中没有yield return语句。做你想做的事情的最好方法(这并不是说一个 super 简单的方法)是编写你自己的 Iterator 的实现。 .

class LazyIterator implements Iterator<Foo> {
    private Iterator<Foo> backingIterator = null; //set this later

    private void lazyLoad() {
        if (backingIterator != null) {
            return;
        }
        //load the backing collection and assign to backingIterator here
    }

    @Override
    public boolean hasNext() {
        lazyLoad();
        return backingIterator.hasNext();
    }

    @Override
    public Foo next() {
        lazyLoad();
        return backingIterator.next();
    }

    @Override
    public void remove() {
        lazyLoad();
        backingIterator.remove();
    }
}

如您所见,这是一个全有或全无的惰性加载程序。您还可以考虑使用增量惰性加载程序,仅在您进行集合时加载数据。这很有用的一种情况是当集合包含大量记录时。

您可能还想要/需要更具体,并编写 Collection 的延迟加载包装器,或List 。该技术类似,但通常需要更多工作(延迟加载的列表可能需要延迟加载的迭代器,并且您可能必须考虑线程安全性,只需考虑一些事情)。

这基本上是手动执行 C# 的 Yield 和 Yield return 关键字在幕后通过编译时转换执行的操作。

关于java - java中是否有用于hibernate中延迟获取的yield return?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9394104/

相关文章:

java - 我应该如何在 Spring Integration 中构建消息?

java - Simtay SimpleCRUD 上解析文件 :LazyUserDataModel. java 时出错

Java GZIPInputStream.read() 函数

java - 启动javaFX程序时出错

java - JPA:创建数据库然后连接

java - 在外部应用程序属性文件中控制 logback 环境相关属性

java - Tomcat 7 "SEVERE: A child container failed during start"

java - AttributeOverride 和 CollectionOfElements,忽略列注释

java - 图像 Servlet 图像返回 null

java - 使用 jdbctemplate 将查询中的数据保存在模型中