如何实现 Java 流?

2022-09-01 03:30:25

我想实现一个.Stream<T>

我不想只使用 ,因为我必须实现大量的方法。implements Stream<T>

这可以避免吗?

更具体地说,我如何流式传输 ,例如:t1t2t3

class Foo<T> {
    T t1, t2, t3;

    Foo(T t1, T t2, T t3) {
        this.t1 = t1;
        this.t2 = t2;
        this.t3 = t3;
    }
}

答案 1

JDK的标准实现是内部类,你不能直接实例化它。Streamjava.util.stream.ReferencePipeline

相反,您可以使用 和其他各种12 静态工厂方法来创建默认实现的实例。java.util.stream.Stream.builder()java.util.stream.StreamSupport.stream(Spliterator<T>, boolean)

使用拆分器可能是最强大的方法,因为它允许您懒惰地提供对象,同时如果您的源可以分成多个块,还可以实现有效的并行化。

此外,您还可以将流转换回拆分器,将它们包装在自定义拆分器中,然后如果需要实现自己的有状态中间操作(例如,由于标准 API 中的缺点),则将它们转换回流,因为大多数可用的中间操作都不允许是有状态的
有关示例,请参阅此 SO 答案

原则上,您可以编写自己的流接口实现,但这将是非常繁琐的。


答案 2

如果你因为想要自定义逻辑而想要创建自己的 Stream,最简单的解决方案是从迭代器创建一个 Stream,然后调用 onClose(Runnable)。例如,要通过 Jackson 从 Reader 进行流式传输:close()

MappingIterator<?> values = objectMapper.reader(type).readValues(reader);
return StreamSupport
        .stream(Spliterators.spliteratorUnknownSize(values, Spliterator.ORDERED), false)
        .onClose(() -> {
            try {
                reader.close();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        });

推荐