Java 11向Predicate接口引入了新方法not()来否定类似于negate方法的现有谓词,进一步增强了其功能,使得条件判断和组合更加灵活和方便。

Predicate.not()

Predicate.not方法用于创建一个取反的谓词(predicate),即返回一个对输入条件取反的Predicate。这个方法使得代码更加简洁和易读,特别是与流操作结合使用时。

Predicate.not方法声明如下:

static <T> Predicate<T> not(Predicate<? super T> target) {
    Objects.requireNonNull(target);
    return (Predicate<T>)target.negate();
}

Predicate.not方法使用如下:

package com.morris.java11;

import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * Predicate.not()的使用
 */
public class PredicateNotDemo {
    public static void main(String[] args) {

        List<Integer> list = Stream.iterate(1, i -> i <= 10, i -> i + 1)
                .filter(Predicate.not(t -> (t % 2) == 0))
                .collect(Collectors.toList());
        System.out.println(list); // [1, 3, 5, 7, 9]
    }
}

多个谓词结合使用

可以通过使用Predicate接口的组合方法(如andornegate)来创建更复杂的条件判断。

package com.morris.java11;

import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;

/**
 * Predicate中and/or/not结合使用
 */
public class PredicateComplexDemo {
    public static void main(String[] args) {
        List<String> names = List.of("Alice", "Bob", "", "Charlie", "David");

        // 创建多个谓词
        Predicate<String> startsWithA = name -> name.startsWith("A");
        Predicate<String> lengthGreaterThanThree = name -> name.length() > 3;

        // 组合谓词
        Predicate<String> complexPredicate = startsWithA.or(lengthGreaterThanThree)
                .and(Predicate.not(String::isEmpty));

        List<String> filteredNames = names.stream()
                .filter(complexPredicate)
                .collect(Collectors.toList());

        System.out.println(filteredNames); // 输出 ["Alice", "Charlie", "David"]
    }
}