java - 如何使用索引而不是前一个元素生成流?

标签 java java-stream

如何生成"new"数据流?具体来说,我希望能够创建包含不可逆函数的数据。 如果我想创建一个流 from an Array 我愿意

Stream.of(arr)

From a collection

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)可能会用来停止流的长度,所以无限流生成器实际上就是我正在寻找的。

最佳答案

如果您希望为采用索引的函数提供无限流,您可以考虑使用创建“几乎无限”流

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/

相关文章:

java - 流上的 reduce() 操作似乎正在修改数据源(列表)Stream API Java 8

java - 收集器与结果类型中的通配符不匹配

java - 如何向现有 Java 8 流添加单个 Key 值?

java - 如何在不创建额外实例变量的情况下创建对象数组?

java - Files.newDirectoryStream 与 Files.list

Java 8 : Stream : Consuming steps to save Intermediate States of streamed elements

java - 从 java 调用 HTPS WebService

java - Tensorflow Lite Android 应用程序崩溃并出现 NullPointerException 'void org.tensorflow.lite.Interpreter.run(java.lang.Object, java.lang.Object)'

java - 非法访问错误: tried to access class while building Android with ANT

Java - 在 MacOS (Snow leopard) 上使 JWindow 的角落 100% 透明