Java Stream过滤器案例解说 - Foojay


使用 Java 流操作集合中的数据比其他方法更方便、更简洁。

import java.util.stream.IntStream;

public class LimitStreamChallenger {

    public static void main(String... doYourBest) {
        IntStream.iterate(0, i -> i + 1)
                .limit(5)
                .filter(i -> i % 2 == 0)
                .forEach(System.out::print);

        IntStream.iterate(0, i -> i + 1)
                .peek(System.out::print)
                .filter(i -> i % 2 == 0)
                .limit(3)
                .forEach(System.out::print);
    }

}
打印输出:
A) 024002244
B) 02400122344
C) 02401234
D) 02401234

分析流代码:

IntStream.iterate(0, i -> i + 1).limit(5).filter(i -> i % 2 == 0)                 
.forEach(System.out::print); 

请注意,我们在迭代行使用了无限流,然后我们将流限制为 5 个元素并按偶数过滤它,最后打印所有元素。由于我们将数字限制为 5,因此我们将让流在 0 到 4 的范围内迭代。然后我们用偶数过滤它,最后打印元素,第一个结果将是 024。
 
在第二个流中,我们使用与第一个流非常相似的结构,但不同之处在于“peek”方法以及 filter 和 limit 方法的顺序。peek 方法将打印此流条件下的所有元素。请记住,peek 方法旨在调试并帮助我们了解 Steam 中发生的事情。然后我们将流元素过滤为偶数,我们将在这里有 0、2 和 4,因为我们受到 3 的限制。
请注意,在此流中,我们确实有 3 个元素,这是因为限制是在 filter 方法之上执行的。
由于 peek 方法将打印所有元素,过滤的和未过滤的,最终输出将是......你怎么看?