当前位置: 首页 > 面试题库 >

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

田丰
2023-03-14
问题内容

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

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

例如,我希望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
++中仅支持移动语义,不支持复制语义(“复制构造函数(已删除)”)。



 类似资料:
  • 问题内容: 我有一些代码,经常在对它们进行很小的更改之后,就经常复制一个大的内存块。 我已经实现了一个跟踪更改的系统,但是我认为,如果可能的话,告诉操作系统对内存进行“写时复制”,让它仅处理这些部分的副本,那可能会很好。哪个改变。但是,尽管Linux会进行写时复制,例如,在fork()ing时,但我找不到控制它并自己执行的方法。 问题答案: 您最好的机会可能是将原始数据保存到文件中,然后再次使用来

  • 问题内容: 是否可以在Java 8中强制转换流?说我有一个对象列表,我可以做这样的事情来过滤掉所有其他对象: 不过,在此之后,如果我想与客户做点事情,则需要对每个客户进行转换: 这看起来有点难看。是否可以将整个流转换为其他类型?像蒙上了一个? 请忽略以下事实:这样做可能意味着不良的设计。我们在计算机科学课上做了类似的事情,所以我一直在研究Java 8的新功能,并且好奇是否有可能。 问题答案: 我认

  • 考虑一个和方法。我想将s映射到s并获得第一个。显而易见的解决方案是使用,但要求返回一个流,而没有方法(或者它是或提供一个方法将其转换为,或将其作为)查看。 我能想出的最好的办法是: 但这似乎是一个很普通的案例,但却显得太冗长了。谁有更好的主意?

  • 我正在为Eclipse3.7.2版本的equinox开发一些插件。不幸的是,我无法升级到最新的equinox平台。所提供的equinox平台在其清单中没有提供“require-capability:osgi.ee;filter=”(&(osgi.ee=javase)(version=1.8))“条目。所以我不能在我的插件中使用”bundle-requiredexecutionEnvironment

  • 问题内容: 说我有一个带有这样的渲染的组件: 其中jewelStyle = 如何使背景颜色动态并随机分配?我试过了 但这会使View的所有实例具有相同的颜色,我希望每个实例都是唯一的。 有小费吗? 问题答案: 我通常按​​照以下方式进行操作: … 每次渲染View时,都会使用与之关联的随机颜色实例化一个新样式对象。当然,这意味着每次重新渲染组件时颜色都会改变,这也许不是您想要的。相反,您可以执行以

  • 我想显示产品浏览历史,所以我将产品id存储在浏览器cookie中。 因为历史记录列表仅限于5项,所以我将cookie值转换为一个数组,然后检查它的长度并删除多余的内容。 下面的代码是我尝试过的,但它不起作用;数组项没有被删除。 我想问一下,如何限制数组长度,使其只能存储5个项目? 或 如何在数组索引4之后剪切项目?