首页 > 解决方案 > Java 如何在现有接口之上构建流

问题描述

我有一个现有的接口,允许我访问理论上无限的集合,如下所示:

List<Element> retrieve(int start, int end);

//example
retrieve(5, 10); // retrieves the elements 5 through 10.

现在我想在这个现有接口之上构建一个 Java 流,这样我就可以根据需要流式传输尽可能多的元素,而无需一次请求一个大列表。

我该怎么做呢?

我查看了 Java 流的示例,我能找到的只是如何从完全在内存中的集合创建流的示例。我目前一次加载 30 个元素并进行必要的处理,但如果我可以抽象出该逻辑并只返回一个流,它会更清晰。

标签: javajava-stream

解决方案


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 开始的无限流。如果有用,您可以添加一个允许设置起始索引的构造函数。


推荐阅读