使用filter


Stream.filter()Stream的另一个常用转换方法。

所谓filter()操作,就是对一个Stream的所有元素一一进行测试,不满足条件的就被“滤掉”了,剩下的满足条件的元素就构成了一个新的Stream

例如,我们对1,2,3,4,5这个Stream调用filter(),传入的测试函数f(x) = x % 2 != 0用来判断元素是否是奇数,这样就过滤掉偶数,只剩下奇数,因此我们得到了另一个序列1,3,5:

  1. f(x) = x % 2 != 0
  2. ┌───┬───┬───┬───┼───┬───┬───┬───┐
  3. [ 1 2 3 4 5 6 7 8 9 ]
  4. X X X X
  5. [ 1 3 5 7 9 ]

用IntStream写出上述逻辑,代码如下:

使用filter - 图1

从结果可知,经过filter()后生成的Stream元素可能变少。

filter()方法接收的对象是Predicate接口对象,它定义了一个test()方法,负责判断元素是否符合条件:

  1. @FunctionalInterface
  2. public interface Predicate<T> {
  3. // 判断元素t是否符合条件:
  4. boolean test(T t);
  5. }

filter()除了常用于数值外,也可应用于任何Java对象。例如,从一组给定的LocalDate中过滤掉工作日,以便得到休息日:

使用filter - 图2

练习

请使用filter()过滤出成绩及格的同学,并打印出名字。

使用filter - 图3下载练习:filter练习 (推荐使用IDE练习插件快速下载)

小结

使用filter()方法可以对一个Stream的每个元素进行测试,通过测试的元素被过滤后生成一个新的Stream

读后有收获可以支付宝请作者喝咖啡,读后有疑问请加微信群讨论:

使用filter - 图4使用filter - 图5