java8 - 內置函數式接口(Predicate)

java.util.function中,有內置了一些函數式接口,包括PredicateConsumerFunctionSupplier等,咱們先看看Predicatejava

Predicate

表示一個涉及類型T的布爾表達式時,就可使用Predicate接口。函數

獲取長度爲1的字符串
public class PredicateDemo {
    public static void main(String[] args) {
        List<String> list = Arrays.asList("1", "2", "3", "11", "22", "33");
        Predicate<String> predicate = (String str) -> str.length() == 1;
        Predicate<String> orPredicate = (String str) -> "11".equals(str);
        Predicate<String> andPredicate = (String str) -> "1".equals(str);
        filter(list, predicate);
        negateFilter(list, predicate);
        orFilter(list, predicate, orPredicate);
        andFilter(list, predicate, andPredicate);
        equalFilter(list);
        andOrFilter(list, predicate, andPredicate, orPredicate);
        orAndFilter(list, predicate, andPredicate, orPredicate);
    }

    public static <T> void filter(List<T> list, Predicate<T> predicate) {
        List<T> result = new ArrayList<>();
        for (T t : list) {
            if (predicate.test(t)) {
                result.add(t);
            }
        }
        System.out.println(result);
    }
}

運行結果以下:
image.png
咱們傳入的T是String類型,返回的是boolean值。ui

複合

Predicate接口還包括了negateandor這三個方法,咱們能夠重用已有的Predicate來建立更復雜的Predicatespa

negate

獲取長度不爲1的字符串

咱們在上面的filter方法改造一下code

public static <T> void negateFilter(List<T> list, Predicate<T> predicate) {
    List<T> result = new ArrayList<>();
    for (T t : list) {
        if (predicate.negate().test(t)) {
            result.add(t);
        }
    }
    System.out.println(result);
}

運行結果以下:
image.png
從negate的源碼,能夠看到在test方法前加了!,因此打印出[11, 22, 33]blog

default Predicate<T> negate() {
    return (t) -> !test(t);
}

or

獲取長度爲1的字符串或者字符串爲11

咱們寫一個orFilter,orPredicate中,是11字符串也返回true接口

public static <T> void orFilter(List<T> list, Predicate<T> predicate, Predicate<T> orPredicate) {
    List<T> result = new ArrayList<>();
    for (T t : list) {
        if (predicate.or(orPredicate).test(t)) {
            result.add(t);
        }
    }
    System.out.println(result);
}

運行結果以下:
image.png
or的源碼:字符串

default Predicate<T> or(Predicate<? super T> other) {
    Objects.requireNonNull(other);
    return (t) -> test(t) || other.test(t);
}

這邊加了||,因此不止1, 2, 3返回true,11也返回true。源碼

and

獲取長度爲1的字符串且字符串爲1

andFilter方法中,andPredicate爲字符串爲1的返回trueit

public static <T> void andFilter(List<T> list, Predicate<T> predicate, Predicate<T> andPredicate) {
    List<T> result = new ArrayList<>();
    for (T t : list) {
        if (predicate.and(andPredicate).test(t)) {
            result.add(t);
        }
    }
    System.out.println(result);
}

運行結果以下:
image.png
and的源碼:

default Predicate<T> and(Predicate<? super T> other) {
    Objects.requireNonNull(other);
    return (t) -> test(t) && other.test(t);
}

這邊加了&&,因此只返回了1。
若是隻是equals,也能夠用下面的方法來,用的Predicate.isEqual靜態方法。

public static <T> void equalFilter(List<T> list) {
    List<T> result = new ArrayList<>();
    for (T t : list) {
        if (Predicate.isEqual("1").test(t)) {
            result.add(t);
        }
    }
    System.out.println(result);
}

and和or

咱們看看andOrFilter和orAndFilter方法

public static <T> void andOrFilter(List<T> list, Predicate<T> predicate, Predicate<T> andPredicate, Predicate<T> orPredicate) {
    List<T> result = new ArrayList<>();
    for (T t : list) {
        if (predicate.and(andPredicate).or(orPredicate).test(t)) {
            result.add(t);
        }
    }
    System.out.println(result);
}

public static <T> void orAndFilter(List<T> list, Predicate<T> predicate, Predicate<T> andPredicate, Predicate<T> orPredicate) {
    List<T> result = new ArrayList<>();
    for (T t : list) {
        if (predicate.or(orPredicate).and(andPredicate).test(t)) {
            result.add(t);
        }
    }
    System.out.println(result);
}

運行結果以下:
image.png第一個先and,再or。and後,符號條件的只有1,or裏面再把11並進來,因此就是1,11。相對於 (A && B) || C。第二個先or,再and。or後,符號條件的是1,2,3,11,and後,只剩下1.相對於 (A or B) && C。

相關文章
相關標籤/搜索