如何实现Java流?

我想实现Stream

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

这可以避免吗?

更具体一点,我如何流t1t2t3 ,例如:

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

JDK的Stream标准实现是内部类java.util.stream.ReferencePipeline ,你无法直接实例化它。

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

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

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

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

您通常不需要编写自己的流类。 相反,您可以通过现有方法创建流。 例如,以下是如何创建值为1,100的流:

  AtomicInteger n = new AtomicInteger(0); Stream stream = Stream.generate(() -> n.incrementAndGet()).limit(100); 

所以在这里我们创建了一个无限的整数流:1,2,3,….然后我们在该无限流上使用limit(100)来获取100个元素的流。

为清楚起见,如果需要整数流(以固定间隔),则应使用IntStream.range() 。 这只是一个示例,用于显示如何使用Stream.generate()定义流,这为您提供了更大的灵活性,因为它允许您使用任意逻辑来确定steam的元素。

如果你想制作自己的Stream,因为你想要自定义close()逻辑,最简单的解决方案是从Iterator创建一个Stream,并调用onClose(Runnable) 。 例如,通过jackson从读者流:

 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); } }); 

其他人已经回答了如何提供通用的Stream实现。 关于您的具体要求,请执行以下操作:

 class Foo { T t1, t2, t3; Foo(T t1, T t2, T t3) { this.t1 = t1; this.t2 = t2; this.t3 = t3; } Stream stream() { return Stream.of(t1, t2, t3); } } 

为了完整起见,我在SO上的答案中没有直接找到这个:如果你想将现有的迭代器转换为Stream(例如,因为你想连续生成元素),请使用:

 StreamSupport.stream( Spliterators.spliterator(myIterator, /* initial size*/ 0L, Spliterator.NONNULL), /* not parallel */ false); 

我发现这有点难以找到,因为你需要知道StreamSupport,Spliterators和Spliterator