java 8中 predicate chain的使用

简介: java 8中 predicate chain的使用

目录



java 8中 predicate chain的使用


简介


Predicate是一个FunctionalInterface,代表的方法需要输入一个参数,返回boolean类型。通常用在stream的filter中,表示是否满足过滤条件。


boolean test(T t);


基本使用


我们先看下在stream的filter中怎么使用Predicate:


@Test
    public void basicUsage(){
        List<String> stringList=Stream.of("a","b","c","d").filter(s -> s.startsWith("a")).collect(Collectors.toList());
        log.info("{}",stringList);
    }


上面的例子很基础了,这里就不多讲了。


使用多个Filter


如果我们有多个Predicate条件,则可以使用多个filter来进行过滤:


public void multipleFilters(){
        List<String> stringList=Stream.of("a","ab","aac","ad").filter(s -> s.startsWith("a"))
                .filter(s -> s.length()>1)
                .collect(Collectors.toList());
        log.info("{}",stringList);
    }


上面的例子中,我们又添加了一个filter,在filter又添加了一个Predicate。


使用复合Predicate


Predicate的定义是输入一个参数,返回boolean值,那么如果有多个测试条件,我们可以将其合并成一个test方法:


@Test
    public void complexPredicate(){
        List<String> stringList=Stream.of("a","ab","aac","ad")
                .filter(s -> s.startsWith("a") &&  s.length()>1)
                .collect(Collectors.toList());
        log.info("{}",stringList);
    }


上面的例子中,我们把s.startsWith("a") && s.length()>1 作为test的实现。


组合Predicate


Predicate虽然是一个interface,但是它有几个默认的方法可以用来实现Predicate之间的组合操作。


比如:Predicate.and(), Predicate.or(), 和 Predicate.negate()。


下面看下他们的例子:


@Test
    public void combiningPredicate(){
        Predicate<String> predicate1 = s -> s.startsWith("a");
        Predicate<String> predicate2 =  s -> s.length() > 1;
        List<String> stringList1 = Stream.of("a","ab","aac","ad")
                .filter(predicate1.and(predicate2))
                .collect(Collectors.toList());
        log.info("{}",stringList1);
        List<String> stringList2 = Stream.of("a","ab","aac","ad")
                .filter(predicate1.or(predicate2))
                .collect(Collectors.toList());
        log.info("{}",stringList2);
        List<String> stringList3 = Stream.of("a","ab","aac","ad")
                .filter(predicate1.or(predicate2.negate()))
                .collect(Collectors.toList());
        log.info("{}",stringList3);
    }


实际上,我们并不需要显示的assign一个predicate,只要是满足

predicate接口的lambda表达式都可以看做是一个predicate。同样可以调用and,or和negate操作:


List<String> stringList4 = Stream.of("a","ab","aac","ad")
                .filter(((Predicate<String>)a -> a.startsWith("a"))
                        .and(a -> a.length() > 1))
                .collect(Collectors.toList());
        log.info("{}",stringList4);


Predicate的集合操作


如果我们有一个Predicate集合,我们可以使用reduce方法来对其进行合并运算:


@Test
    public void combiningPredicateCollection(){
        List<Predicate<String>> allPredicates = new ArrayList<>();
        allPredicates.add(a -> a.startsWith("a"));
        allPredicates.add(a -> a.length() > 1);
        List<String> stringList = Stream.of("a","ab","aac","ad")
                .filter(allPredicates.stream().reduce(x->true, Predicate::and))
                .collect(Collectors.toList());
        log.info("{}",stringList);
    }


上面的例子中,我们调用reduce方法,对集合中的Predicate进行了and操作。


总结


本文介绍了多种Predicate的操作,希望大家在实际工作中灵活应用。


本文的例子https://github.com/ddean2009/learn-java-streams/tree/master/predicate-chain

相关文章
|
7月前
|
设计模式 Java 应用服务中间件
【设计模式——学习笔记】23种设计模式——职责链/责任链模式(Chain of Responsibility)(原理讲解+应用场景介绍+案例介绍+Java代码实现)
【设计模式——学习笔记】23种设计模式——职责链/责任链模式(Chain of Responsibility)(原理讲解+应用场景介绍+案例介绍+Java代码实现)
79 0
|
8月前
|
存储 Java
java.security.cert.CertificateException: None of the TrustManagers trust this certificate chain
ava.security.cert.CertificateException: None of the TrustManagers trust this certificate chain
990 2
|
10月前
|
Java
Java 8 Predicate接口使用
Java8里面Predicate<T>是一个函数式接口,它接受一个参数返回一个boolean类型,通常在集合对象的筛选器中使用。
63 0
|
10月前
|
设计模式 Java uml
Java中23种面试常考的设计模式之责任链模式(Chain of Responsibility)---行为型模式
Java中23种面试常考的设计模式之责任链模式(Chain of Responsibility)---行为型模式
61 1
Java8中的函数式接口详解(Supplier、Consumer、Predicate、Function)
Java8中的函数式接口详解(Supplier、Consumer、Predicate、Function)
625 1
Lombok插件@Accessors(chain = true)开启链式开发
Lombok插件@Accessors(chain = true)开启链式开发
213 0
Lombok @Accessors(chain=true) 用法
Lombok @Accessors(chain=true) 用法
521 0
Lombok @Accessors(chain=true) 用法
|
Java API 数据安全/隐私保护
【小家java】java8新特性之---函数式接口(Supplier、Consumer、Predicate、Function、UnaryOperator,通往高阶设计的好工具)(上)
【小家java】java8新特性之---函数式接口(Supplier、Consumer、Predicate、Function、UnaryOperator,通往高阶设计的好工具)(上)
【小家java】java8新特性之---函数式接口(Supplier、Consumer、Predicate、Function、UnaryOperator,通往高阶设计的好工具)(上)
【小家java】java8新特性之---函数式接口(Supplier、Consumer、Predicate、Function、UnaryOperator,通往高阶设计的好工具)(下)
【小家java】java8新特性之---函数式接口(Supplier、Consumer、Predicate、Function、UnaryOperator,通往高阶设计的好工具)(下)
Java 8 Predicate 函数接口
Java 8 Predicate 函数接口
202 0