java - Java 如何在现有接口之上构建流
问题描述
我有一个现有的接口,允许我访问理论上无限的集合,如下所示:
List<Element> retrieve(int start, int end);
//example
retrieve(5, 10); // retrieves the elements 5 through 10.
现在我想在这个现有接口之上构建一个 Java 流,这样我就可以根据需要流式传输尽可能多的元素,而无需一次请求一个大列表。
我该怎么做呢?
我查看了 Java 流的示例,我能找到的只是如何从完全在内存中的集合创建流的示例。我目前一次加载 30 个元素并进行必要的处理,但如果我可以抽象出该逻辑并只返回一个流,它会更清晰。
解决方案
class Chunk implements Supplier<Element> {
private final Generator generator;
private final int chunkSize;
private List<Element> list = Collections.emptyList();
private int index = 0;
public Chunk(Generator generator, int chunkSize) {
assert chunkSize > 0;
this.generator = generator;
this.chunkSize = chunkSize;
}
@Override
public Element get() {
if (list.isEmpty()) {
list = generator.retrieve(index, index + chunkSize);
index += chunkSize;
}
return list.remove(0);
}
}
在这里,我假设retrieve
返回一个可变列表。如果没有,那么此时您需要创建一个新的ArrayList
或等效的。
这可以用作Stream.generate(new Chuck(generator, 30))
. 它会生成一个从索引 0 开始的无限流。如果有用,您可以添加一个允许设置起始索引的构造函数。
推荐阅读
- python - 接收时的 MQTT 消息计数器
- python - 不和谐机器人如何具有移动状态?
- junit4 - Surefire 2.22.0:java.lang.IllegalStateException:错误 [STOPPED] 读取进程
- .net - 私有 NuGet 提要和 docker 缓存(Windows)
- .net - IIS 8 中的 CGI 模块加载 .NET 程序集时出现问题
- android - 在 Firebase 上进行电话身份验证时出错
- reactjs - 将 JSON 数据从 Django 传递到 React 组件
- python - 提到了 pygame 代码,需要按规定进行一些修改:
- json - 使用嵌套数组原始 spark sql 爆炸数组
- assembly - 为什么我的寄存器 cx 显示非零值?