Java 8中是否可以复制流?

82

有时候我想在一个流上执行一系列操作,然后用其他操作以两种不同的方式处理结果流。

我能否无需重复指定共同的初始操作而实现这个目的?

例如,我希望存在一个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

2
我确实意识到流惰性计算不会有任何性能提升;我只是希望避免重复代码。 - necromancer
1
定位代码中的变化部分并将其提取到变量中。然后创建一个方法来提取可重用的代码片段并将变量应用于其中。 - d1e
@Elazar 这样做既不会高效利用内存,也无法处理无限流! - necromancer
2
没有更多的信息,无法复制一般的无限流。 - Elazar
@necromancer 我试了一下。 - Elazar
显示剩余3条评论
11个回答

1
对于非无限流,如果您可以访问源,则很简单:
@Test
public void testName() throws Exception {
    List<Integer> integers = Arrays.asList(1, 2, 4, 5, 6, 7, 8, 9, 10);
    Stream<Integer> stream1 = integers.stream();
    Stream<Integer> stream2 = integers.stream();

    stream1.forEach(System.out::println);
    stream2.forEach(System.out::println);
}

打印

1 2 4 5 6 7 8 9 10

1 2 4 5 6 7 8 9 10

对于您的情况:

Stream originalStream = IntStream.range(1, 100).filter(n -> n % 2 == 0)

List<Integer> listOf = originalStream.collect(Collectors.toList())

Stream stream14 = listOf.stream().filter(n -> n % 7 == 0);
Stream stream10 = listOf.stream().filter(n -> n % 5 == 0);

关于性能等问题,请参考其他人的回答 ;)


1
谢谢,但问题的本质是要为一个源不可访问或不确定(如stdin)的流进行“tee”操作。我现在很清楚这样做的成本主要取决于有效消耗率的差异。例如,如果一个消费者比另一个消费者先运行得多,那么差异需要单独和额外地缓冲。 - necromancer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接