我可以在Java 8中复制Stream吗?

有时我想对流执行一组操作,然后用其他操作以两种不同的方式处理结果流。

我可以不必指定两次常见的初始操作来执行此操作吗?

例如,我希望dup()存在以下方法:

Stream [] desired_streams = IntStream.range(1, 100).filter(n -> n % 2 == 0).dup();

Stream stream14 = desired_streams[0].filter(n -> n % 7 == 0); // multiples of 14

Stream stream10 = desired_streams[1].filter(n -> n % 5 == 0); // multiples of 10

回答:

通常这是不可能的。

如果要复制输入流或输入迭代器,则有两个选择:

答:将所有内容都保存在集合中,例如 List<>

假设您将一个流复制为两个流,s1然后将s2。如果您的n1元素中包含高级元素,s1并且n2元素中包含s2,则必须将|n2 -

n1|元素保留在内存中,以便跟上步伐。如果流是无限的,则可能没有所需存储空间的上限。

看一下Python

tee(),看看需要什么:

此itertool可能需要大量辅助存储(取决于需要存储多少临时数据)。一般来说,如果一个迭代器使用大部分或全部的数据的另一个前开始迭代器,它是更快地使用list()代替tee()

B.尽可能:复制创建元素的生成器的状态

为了使此选项起作用,您可能需要访问流的内部工作方式。换句话说,生成器(创建元素的部分)首先应支持复制。[OP:请参见下个[

,作为该问题示例如何完成的示例]

由于您必须复制整个“外部世界”的状态,因此无法根据用户输入进行操作。Java

Stream不支持复制,因为它被设计为尽可能通用。例如,使用文件,网络,键盘,传感器,随机性等。[OP:另一个示例是按需读取温度传感器的流。如果不保存读数的副本,则无法复制它]

这不仅是Java中的情况;这是一个一般规则。您可以看到std::istream,由于这个原因(以及其他原因),在C

++中仅支持移动语义,不支持复制语义(“复制构造函数(已删除)”)。

以上是 我可以在Java 8中复制Stream吗? 的全部内容, 来源链接: utcz.com/qa/411075.html

回到顶部