java - Java8中如何将一个流缩减为另一个流?

标签 java java-8 java-stream

举个例子,我想创建一个无限的十组流,如下所示:

0=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
1=[10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
2=[20, 21, 22, 23, 24, 25, 26, 27, 28, 29]
...

我想使用 inifinte 整数流作为输入,然后对其进行分组。如果第一个流迭代 10 次,则结果流应该只迭代一次。

我的工作但不是很优雅的代码如下所示:

// create a stream from 0 (inclusive) to 100 (exclusive)
IntStream.iterate(0, i -> i+1).boxed().limit(100)

// slow down
.peek((i) -> {try {Thread.sleep(50);} catch (InterruptedException e) {}})

// group by tens
/* ugly: */.collect(Collectors.groupingBy(i -> i / 10)).entrySet()
/* not working: */ //.makeSequentialGroups(i -> i / 10)

// print to console
.forEach(System.out::println);  

如何对 int 流进行分组,而无需收集和重新流式传输? (如果可能的话,甚至不必使用拳击)

最佳答案

这样的功能可以在我的StreamEx中找到。图书馆并称为 groupRuns :您可以根据提供的谓词将相邻元素收集到中间列表中。示例:

IntStreamEx.iterate(0, i -> i+1).boxed().limit(100)
    .peek((i) -> {try {Thread.sleep(50);} catch (InterruptedException e) {}})
    .groupRuns((a, b) -> a/10 == b/10)
    .forEach(System.out::println);

关于java - Java8中如何将一个流缩减为另一个流?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30681805/

相关文章:

java - JMockit:测试覆盖抽象方法的方法

java - 同步块(synchronized block)是否有最大可重入限制?

java - 如何在 JAVA 8 中的 lambda 函数中测试需要用户输入的代码?

java - 通过网络传输类型 double[]

java - Java 流是否仅用于数组?单元素呢?

java - Collectors.groupby 用于 Map<String,List<String>

java - 使用 Java 8 Streams,如何在 HashMap 中找到给定元素的最大值

Java 和 MySql。哪个异常真正需要 "rollback"

java - 读取文本文件中的字符串

java 将 toString() 传递给方法