延迟加载对象列表的接口

Interface for Lazy Loaded List of Objects

我们有一大堆数据源,我们可以在其中查询一些 REST API 或其他数据源,并取回对象列表。我正在尝试设计一个抽象层,它不需要知道如何联系任何特定的 API 实例或如何从语义上解释对象,但可以保证我们从 class实现了我们当时需要的接口

我希望有时结果的数量会非常大(但总是有限的!)并且检索速度通常很慢,所以我需要一些不会一次性将所有内容加载到内存但允许列表结果的东西在它们可用时使用。如果列表在 nexthasNext 或任何适当的类似物上阻塞,我很好。

实现这些目标最合适的抽象/方法是什么?它是如何实现的?

我的直觉告诉我它应该是 Java 8 Streams 的某种风格,可能是通过 Java 9 Stream.iterate 方法创建的,但我不太熟悉函数式编程范例,我终生无法弄清楚如何填充 Stream 的元素,因为它们可从 REST 调用中获得,并在完成时将其关闭。

事实证明,我混淆了两个问题:如何在接口中提供迭代器(这很简单),以及如何在后台填充该迭代器。我大致得到以下结果:

创建一个实现 Iterator 的自定义抽象 class。 class 有一个内部 BlockingQueue 和一个内部列表。它还定义了一个抽象方法,旨在在一次调用中执行填充的所有活动。

第一次调用 hasNext() 时,启动调用该抽象方法的守护线程。然后,当线程处于活动状态(意味着它仍在填充 BlockingQueue)或 List 不为空(意味着并非所有元素都已通过 next() 消耗)时,轮询 BlockingQueue 直到它至少有一个元素在它。一旦完成,删除该元素并将其添加到列表中。 next() 列表中只有 returns 个元素。

这会导致延迟加载(在第一次调用 hasNext() 之前不会发生任何事情),这也会在后台异步发生——调用者将能够在它们可用时立即处理它们(如果东西不可用,hasNext() 将阻塞),并且它不会占用不合理的内存量(如果元素太多,BlockingQueue 将阻塞)。