我可以在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