本文转载自微信公众号《未读码》,作者未读君。转载本文请联系未读码公众号。和前面介绍的Function接口一样,Predicate函数接口是一个函数式接口,可以接受一个泛型的参数,返回一个Boolean类型。谓词常用于数据过滤,如过滤掉集合中满足某种条件的元素。源代码:Java8中的函数式接口Predicate。(other);return(t)->test(t)&&other.test(t);}defaultPredicatenegate(){return(t)->!test(t);}defaultPredicateor(Predicateother){Objects.requireNonNull(other);return(t)->test(t)||other.test(t);}staticPredicateisEqual(ObjecttargetRef){return(null==targetRef)?Objects::isNull:object->targetRef.equals(object);}}1.PredicatetestPredicate函数接口可以用来判断一个参数是否满足某个条件。示例:检查字符串是否为空。importjava.util.function.Predicate;publicclassJava8PredicateTest{publicstaticvoidmain(String[]args){PredicateisEmpty=String::isEmpty;System.out.println(isEmpty.test(""));System.out.println(isEmpty.test("www.wdbyte.com"));}}输出结果:truefalse2.PredicateStream中的filter()方法filterStream是通过接收一个Predicate函数接口来实现的。示例:过滤掉集合中字符串长度为4的字符串。importjava.util.Arrays;importjava.util.List;importjava.util.stream.Collectors;publicclassJava8PredicateFilter{publicstaticvoidmain(String[]args){Listlist=Arrays.asList("java","node","www.wdbyte.com");list=list.stream().filter(str->str.length()==4).collect(Collectors.toList());System.out.println(list);}}输出结果:[java,node]3.Predicateand使用and()方法使两个predicate判断条件一起生效。示例1:过滤数字集合中大小介于5和9之间的数字。importjava.util.Arrays;importjava.util.List;importjava.util.function.Predicate;importjava.util.stream.Collectors;publicclassJava8PredicateAnd{publicstaticvoidmain(String[]args){ListnumberList=Arrays.asList(3,4,5,6,7,8,9,10);PredicategreaterThan5=number->number>5;PredicatelessThan9=number->number<9;Predicatefilter=greaterThan5。and(lessThan9);numberList=numberList.stream().filter(filter).collect(Collectors.toList());System.out.println(numberList);}}结果输出:[6,7,8]例2:Predicate过滤数字集合中大小在5到9之间的数字。ListnumberList=Arrays.asList(3,4,5,6,7,8,9,10);numberList=numberList.stream().filter(x->x>5&&x<9).collect(收集器.toList());System.out.println(numberList);输出结果;[6,7,8]4.Predicatenegatepredicate.negate()方法返回一个与指定判断相反的Predicate。示例:过滤数字集合中不大于5的数字。importjava.util.Arrays;importjava.util.List;importjava.util.function.Predicate;importjava.util.stream.Collectors;publicclassJava8PredicateNeagete{publicstaticvoidmain(String[]args){ListnumberList=Arrays.asList(3,4,5,6,7,8,9,10);PredicategreaterThan5=number->number>5;numberList=numberList.stream().filter(greaterThan5.negate()).collect(Collectors.toList());System.out.println(numberList);}}输出结果:[3,4,5]5.谓词或例子:过滤数字集合中小于等于5或大于等于9的数字.importjava.util.Arrays;importjava.util.List;importjava.util.function.Predicate;importjava.util.stream.Collectors;publicclassJava8PredicateOr{publicstaticvoidmain(String[]args){ListnumberList=Arrays.asList(3,4,5,6,7,8,9,10);PredicatelessThan5=number->number<=5;PredicategreaterThan8=number->number>=9;numberList=numberList.stream().filter(lessThan5.or(greaterThan8)).collect(Collectors.toList());System.out.println(numberList);}}输出结果:[3,4,5,9,10]6.谓词链Predicate的or()、and()、negate()方法可以随意组合Predicates,组合后的判断逻辑从左到右,从前到后依次判断。如:(小于5的数).and(大于9的数).negate()。解决方法:(numberlessthan5)AND(numbergreaterthan9)对任何数都为假,false.negate()取反为真。所以这个判断逻辑对任何数都成立。示例:Predicate的or()、and()、negate()方法组合使用。importjava.util.ArrayList;importjava.util.Arrays;importjava.util.List;importjava.util.function.Predicate;publicclassJava8PredicateChain{publicstaticvoidmain(String[]args){ListnumberList=Arrays.asList(3,4,5,6,7,8,9,10);PredicatelessThan5=number->number<=5;PredicategreaterThan9=number->number>=9;//小于等于5System.out.println(filter(numberList,lessThan5));//大于5System.out.println(filter(numberList,lessThan5.negate()));//小于等于5或大于等于9System.out.println(filter(numberList,lessThan5.or(greaterThan9)));//!(小于等于5AND大于或等于9)System.out.println(filter(numberList,lessThan5.and(greaterThan9).negate()));}publicstaticListfilter(Listlist,Predicatepredicate){ListresultList=newArrayList<>();for(Tt:list){if(predicate.test(t)){resultList.add(t);}}returnresultList;}}输出结果:[3,4,5][6,7,8,9,10][3,4,5,9,10][3,4,5,6,7,8,9,10]7。谓词与宾语示例:过滤符合某些特征的狗。importjava.util.ArrayList;importjava.util.List;importjava.util.function.Predicate;publicclassJava8PredicateObject{publicstaticvoidmain(String[]args){ListdogList=newArrayList<>();dogList.add(newDog("哈士奇",1));dogList.add(newDog("牧羊犬",2));dogList.add(newDog("柯基",3));dogList.add(newDog("柴犬",3));//找到3岁的狗System.out.println(filter(dogList,dog->dog.getAge().equals(3)));//找到哈士奇信息Predicatepredicate=dog->("哈士奇").equals(dog.getName());System.out.println(filter(dogList,predicate));}publicstaticListfilter(Listlist,Predicatepredicate){ListresultList=newArrayList<>();for(Tt:list){if(predicate.test(t)){resultList.add(t);}}returnresultList;}}classDog{privateStringname;privateIntegerage;publicDog(Stringname,Integerage){this.name=name;this.age=age;}publicStringgetName(){returnname;}publicvoidsetName(Stringname){this.name=name;}publicIntegergetAge(){returnage;}publicvoidsetAge(Integerage){this.age=age;}@OverridepublicStringtoString(){return"Dog{"+"name='"+name+'\''+",age="+age+'}';}}输出结果:[Dog{name='Corgi',age=3},Dog{name='ShibaInu',age=3}][Dog{name='Husky',age=1}]BiPredicate和Predicate函数接口一样,返回一个布尔类型,唯一的区别是Predicate接受一个参数,而BiPredicate可以接受两种不同类型的参数,Java8中BiPredicate源码:packagejava.util.function;importjava。效用。对象;@FunctionalInterfacepublicinterfaceBiPredicate{booleantest(Tt,Uu);defaultBiPredicateand(BiPredicateother){Objects.requireNonNull(other);return(Tt,Uu)->test(t,u)&&other.test(t,u);}defaultBiPredicatenegate(){return(Tt,Uu)->!test(t,u);}defaultBiPredicateor(BiPredicateother){Objects.requireNonNull(other);return(Tt,Uu)->test(t,u)||other.test(t,u);}}