java8 – 内置函数式接口(Predicate)

java.util.function 中,有内置了一些函数式接口,包括 PredicateConsumerFunctionSupplier 等,我们先看看 Predicate

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);
    }
}

运行结果如下:

java8 - 内置函数式接口(Predicate)

我们传入的T是String类型,返回的是boolean值。

复合

Predicate 接口还包括了 negateandor 这三个方法,我们可以重用已有的 Predicate 来创建更复杂的 Predicate

negate

获取长度不为1的字符串

我们在上面的filter方法改造一下

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);
}

运行结果如下:

java8 - 内置函数式接口(Predicate)

从negate的源码,可以看到在test方法前加了!,所以打印出[11, 22, 33]

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);
}

运行结果如下:

java8 - 内置函数式接口(Predicate)

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的返回true

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);
}

运行结果如下:

java8 - 内置函数式接口(Predicate)

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);
}

运行结果如下:

java8 - 内置函数式接口(Predicate)

第一个先and,再or。and后,符号条件的只有1,or里面再把11并进来,所以就是1,11。相对于 (A && B) || C。

第二个先or,再and。or后,符号条件的是1,2,3,11,and后,只剩下1.相对于 (A or B) && C。

原文 

https://segmentfault.com/a/1190000021527696

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » java8 – 内置函数式接口(Predicate)

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址