【发布时间】:2015-09-09 14:10:20
【问题描述】:
如何按位置从Stream 中提取两个元素?例如,我试图从Stream<String> 中提取元素 0 和 1(这些数字是任意的!)。一种天真的方法是这样的:
List<String> strings = Arrays.asList("s0", "s1", "s2", "s3", "s4");
Consumer<String> c0 = s -> System.out.println("c0.accept(" + s + ")");
Consumer<String> c1 = s -> System.out.println("c1.accept(" + s + ")");
strings.stream().skip(0).peek(c0).skip(1).peek(c1).findAny();
这会产生以下输出:
c0.accept(s0)
c0.accept(s1)
c1.accept(s1)
我知道这是因为s0 将进入流,遇到skip(0),然后遇到peek(c0)(给出第一行),然后是skip(1),它将跳过这个元素,然后显然继续流开头的下一个元素。
我以为我可以使用这些消费者来提取字符串,但 c0 会被第二个元素覆盖:
String[] extracted = new String[2];
c0 = s -> extracted[0];
c1 = s -> extracted[1];
编辑:
这些是流的特征:
- 只有流,没有列表或数组
- 流可能是无限的
- 可以制作流sequential
【问题讨论】:
-
首先,
skip(0)没有任何作用,您可以将其删除。其次,您必须多解释一下您的用例,因为您最好使用原始列表按索引提取,而不是使用流。 -
您不能真正通过索引从
Stream中提取,因为流不是List- 它是任意流 项。您需要告诉我们您要做什么,因为这听起来很像 XY Problem。 -
@steffen 以及流是否并行?一般情况下没有“第 5 项”。
-
为什么不向流询问迭代器,然后根据需要跳过元素?流必须是连续的。
-
我不会说它是重复的。在linked 问题中,允许随机访问流源,许多解决方案都使用此属性。这里 OP 明确表示,这是不允许的。另一方面,问题更具体,并产生不同的答案。例如,
limit无法解决该问题。
标签: java java-8 java-stream