如何生成"new"数据流?具体来说,我希望能够创建包含不可逆函数的数据。 如果我想创建一个流 from an Array 我愿意
Stream.of(arr)
col.stream()
一个constant stream可以用 lambda 表达式来实现
Stream.generate(() -> "constant")
一个stream based最后一个输入(任何可逆函数)可以通过
来实现Stream.iterate(0, x -> x + 2)
但是如果我想创建一个更通用的生成器(例如输出一个数字是否能被三整除:0,0,1,0,0,1,0,0,1...)而不创建新的生成器类。
主要问题是我需要某种方式将索引输入到 lambda 中,因为我想要一个模式,而不是依赖于函数的最后输出。
注意:
someStream.limit(length)
可能会用来停止流的长度,所以无限流生成器实际上就是我正在寻找的。p>
最佳答案
如果您希望为采用索引的函数提供无限流,您可以考虑使用创建“几乎无限”流
IntStream.rangeClosed(0, Integer.MAX_VALUE).map(index -> your lambda)
分别
IntStream.rangeClosed(0, Integer.MAX_VALUE).mapToObj(index -> your lambda)
对于 Stream
而不是 IntStream
。
这并不是真正的无限,但在 Integer.MAX_VALUE
之后没有 int
值来表示索引,因此您有一个语义当达到该索引时要解决的问题。
此外,当使用 LongStream.rangeClosed(0, Long.MAX_VALUE).map(index -> yourLambda)
时,每个元素计算只需要一纳秒,则需要近三百年的时间才能完成处理所有元素。
但是,当然,有一种方法可以使用创建真正的无限流
Stream.iterate(BigInteger.ZERO, BigInteger.ONE::add).map(index -> yourLambda)
一旦索引无法再出现在堆内存中,它可能会永远运行,或者更有可能的是,如果您的处理达到了这种程度,就会出现 OutOfMemoryError 。
请注意,使用 range[Closed]
构造的流可能比使用 Stream.iterate
构造的流更有效。
关于java - 如何使用索引而不是前一个元素生成流?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46314305/