使用流媒体流

时间:2016-01-27 21:56:31

标签: java exception java-stream

如果我可以做这样的话,我想解决。假设我有一个数字1到20的流。我想利用诸如drop 3之类的功能(限制或跳过我猜的Java术语?)并产生一个流数字流:

1 - 20,4 - 20,7 - 20等

然后可能将这些alll平面映射到一个流中。我已经尝试过使用Stream.iterate的各种组合,主要是从流生成流,但我一直在设置一个IllegalStateException,说流已经运行或关闭。

例如,人们可能期望这段代码:

  Stream.iterate(Stream.of(1,2,3,4,5), x -> x.skip(1).collect(Collectors.toList()).stream()).limit(5).flatMap(x -> x).forEach(x -> System.out.println(x));

生产:1,2,3,4,5,2,3,4,5,3,4,5,4,5,5

但它没有,它会引发异常。我错过了一些明显的东西。我知道一个takeWhile操作,但不要认为它直到Java 9。

编辑:我已经设法通过以下方式获得了我想要实现的目标的丑陋解决方案:

List<Integer> list = IntStream.rangeClosed(1, 20).boxed().collect(Collectors.toList());
Stream.iterate(list, x -> x.stream().skip(3).collect(Collectors.toList())).limit(7).map(x -> x.stream().limit(3).collect(Collectors.toList())).flatMap(List::stream).forEach(System.out::println);

所以我有一个列表1..20,然后最终得到一个列表流1..20,4..20,7..20等。如果我然后取这些列表的前3个元素我最终得到1..3,4..6,7..9等等。如果我平坦地图,我会回到1..20。

我的问题是,A。有没有办法让我不必硬编码上面的限制(7),所以当我处理完所有的输入元素集时,它会自动停止,而且我不会# 39;不喜欢收集到列表中 - 我不能在收集结束之前完全使用流,或者甚至只是在平面地图之后打印吗?

1 个答案:

答案 0 :(得分:4)

也许你正在寻找像

这样的东西
IntStream.rangeClosed(1, 20)
   .flatMap(i -> IntStream.rangeClosed(i, 20))

...然后你可以做任何你喜欢的事情;例如.forEach(System.out::println)

如果你想为每三个数字做一次,你最好做一些像

这样的事情
IntStream.rangeClosed(0, 20/3)
  .map(i -> 3 * i + 1)
  .flatMap(i -> IntStream.rangeClosed(i, 20))