当前位置: 代码迷 >> 综合 >> Java 基础 (20) --Java 8 新特性:Predicate
  详细解决方案

Java 基础 (20) --Java 8 新特性:Predicate

热度:71   发布时间:2023-12-16 13:22:26.0

文章目录

    • 1. 源码
    • 2. 分析

1. 源码

public interface Predicate<T> {
    boolean test(T t);default Predicate<T> and(Predicate<? super T> other) {
    Objects.requireNonNull(other);return (t) -> test(t) && other.test(t);}default Predicate<T> negate() {
    return (t) -> !test(t);}default Predicate<T> or(Predicate<? super T> other) {
    Objects.requireNonNull(other);return (t) -> test(t) || other.test(t);}static <T> Predicate<T> isEqual(Object targetRef) {
    return (null == targetRef)? Objects::isNull: object -> targetRef.equals(object);}
}

2. 分析

  1. Predicate 是个断言式接口其参数是 <T,boolean>,也就是给一个参数T,返回boolean类型的结果。跟 Function 一样,Predicate 的具体实现也是根据传入的lambda表达式来决定的。

    boolean test(T t);
    
  2. Predicate 默认实现了三个重要的方法 and,or 和 negate,这三个方法对应了 java 的三个连接符号&&、||、!,基本的使用十分简单,如:

    int[] numbers= {
          1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
    List<Integer> list=new ArrayList<>();
    for(int i:numbers) {
          list.add(i);
    }
    Predicate<Integer> p1=i->i>5;
    Predicate<Integer> p2=i->i<20;
    Predicate<Integer> p3=i->i%2==0;
    List test=list.stream().filter(p1.and(p2).and(p3)).collect(Collectors.toList());
    System.out.println(test.toString()); //结果 [6, 8, 10, 12, 14]
    

    我们定义了三个断言 p1,p2,p3。现在有一个从 1~15 的 list,我们需要过滤这个 list。上述的 filter 是过滤出所有大于 5 小于20,并且是偶数的列表。

    假如突然我们的需求变了,我们现在需要过滤出奇数。那么我不可能直接去改Predicate,因为实际项目中这个条件可能在别的地方也要使用。那么此时我只需要更改 filter 中 Predicate 的条件:

    List test=list.stream().filter(p1.and(p2).and(p3.negate())).collect(Collectors.toList());//结果
    [7, 9, 11, 13, 15]
    

    我们直接对p3这个条件取反就可以实现了。

  3. isEqual 这个方法的返回类型也是 Predicate,所以我们也可以把它作为函数式接口进行使用。我们可以当做==操作符来使用

    List test=list.stream().filter(p1.and(p2).and(p3.negate()).and(Predicate.isEqual(7))).collect(Collectors.toList());//结果
    7
    
  相关解决方案