我想流式传输通过RestApi Java客户端读取的对象。 客户端以分页的方式读取数据集。
我想出的解决方案是从Iterable创建一个Source,在该Iterable中,随着Source对更多元素的需求,它会延迟加载页面。
它看起来像这样:
Source.from(myClient.getObjects())
public class MyClient<T> {
public Iterable<T> getObjects() {
return new Iterable<T>() {
@Override
@Nonnull
public Iterator<T> iterator() {
return new MyIterator<>(this);
}
};
}
private class MyIterator<T> implements Iterator<T> {
private final MyClient client;
private final Queue<T> latestPage;
boolean end = false;
MyIterator(MyClient client) {
this.client = client;
latestPage = new LinkedList<>();
latestPage.addAll(loadNextPage());
}
private Collection<T> loadNextPage() {
Collection<T> nextPage = client.getNextPage();
if (nextPage.isEmpty()) {
end = true;
}
return nextPage;
}
@Override
public boolean hasNext() {
if (latestPage.isEmpty() && (!end)) {
latestPage.addAll(loadNextPage());
}
return !latestPage.isEmpty();
}
@Override
public T next() {
return latestPage.poll();
}
}
}
这似乎很好。但是后来我在文档中注意到了this:
Source.from()流可迭代的值。确保可迭代 在用作来源后是不变的,或者至少没有被修改。
问题: