java filter讲解_使用filter

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

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

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

f(x) = x % 2 != 0

┌───┬───┬───┬───┼───┬───┬───┬───┐

│ │ │ │ │ │ │ │ │

▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼

[ 1 2 3 4 5 6 7 8 9 ]

│ X │ X │ X │ X │

│ │ │ │ │

▼ ▼ ▼ ▼ ▼

[ 1 3 5 7 9 ]

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

import java.util.stream.IntStream;

----

public class Main {

public static void main(String[] args) {

IntStream.of(1, 2, 3, 4, 5, 6, 7, 8, 9)

.filter(n -> n % 2 != 0)

.forEach(System.out::println);

}

}

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

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

@FunctionalInterface

public interface Predicate {

// 判断元素t是否符合条件:

boolean test(T t);

}

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

import java.time.*;

import java.util.function.*;

import java.util.stream.*;

----

public class Main {

public static void main(String[] args) {

Stream.generate(new LocalDateSupplier())

.limit(31)

.filter(ldt -> ldt.getDayOfWeek() == DayOfWeek.SATURDAY || ldt.getDayOfWeek() == DayOfWeek.SUNDAY)

.forEach(System.out::println);

}

}

class LocalDateSupplier implements Supplier {

LocalDate start = LocalDate.of(2020, 1, 1);

int n = -1;

public LocalDate get() {

n++;

return start.plusDays(n);

}

}

练习

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

小结

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值