本文转载自微信公众号「未读代码」,作者未读君。转载本文请联系未读代码公众号。
成都创新互联公司是一家专注于做网站、成都网站制作与策划设计,迎江网站建设哪家好?成都创新互联公司做网站,专注于网站建设十多年,网设计领域的专业建站公司;建站业务涵盖:迎江等地区。迎江做网站价格咨询:028-86922220
Predicate 函数接口同之前介绍的 Function 接口一样,是一个函数式接口,它可以接受一个泛型
源码:Java 8 中函数接口 Predicate。
- package java.util.function;
- import java.util.Objects;
- @FunctionalInterface
- public interface Predicate
{ - boolean test(T t);
- default Predicate
and(Predicate super T> other) { - Objects.requireNonNull(other);
- return (t) -> test(t) && other.test(t);
- }
- default Predicate
negate() { - return (t) -> !test(t);
- }
- default Predicate
or(Predicate super T> other) { - Objects.requireNonNull(other);
- return (t) -> test(t) || other.test(t);
- }
- static
Predicate isEqual(Object targetRef) { - return (null == targetRef)
- ? Objects::isNull
- : object -> targetRef.equals(object);
- }
- }
Predicate 函数接口可以用于判断一个参数是否符合某个条件。
示例:判断某个字符串是否为空。
- import java.util.function.Predicate;
- public class Java8PredicateTest {
- public static void main(String[] args) {
- Predicate
isEmpty = String::isEmpty; - System.out.println(isEmpty.test(""));
- System.out.println(isEmpty.test("www.wdbyte.com"));
- }
- }
输出结果:
- true
- false
Stream 中的 filter() 方法是通过接收一个 Predicate 函数接口实现的。
示例:过滤出集合中,字符串长度为 4 的字符串。
- import java.util.Arrays;
- import java.util.List;
- import java.util.stream.Collectors;
- public class Java8PredicateFilter {
- public static void main(String[] args) {
- List
list = Arrays.asList("java", "node", "www.wdbyte.com"); - list = list.stream().filter(str -> str.length() == 4).collect(Collectors.toList());
- System.out.println(list);
- }
- }
输出结果:
- [java, node]
使用 and() 方法,可以让前后两个 Predicate 判断条件一起生效。
示例 1:过滤数字集合中,数字大小在 5 至 9 之间的数字。
- import java.util.Arrays;
- import java.util.List;
- import java.util.function.Predicate;
- import java.util.stream.Collectors;
- public class Java8PredicateAnd {
- public static void main(String[] args) {
- List
numberList = Arrays.asList(3, 4, 5, 6, 7, 8, 9, 10); - Predicate
greaterThan5 = number -> number > 5; - Predicate
lessThan9 = number -> number < 9; - Predicate
filter = greaterThan5.and(lessThan9); - numberList = numberList.stream().filter(filter).collect(Collectors.toList());
- System.out.println(numberList);
- }
- }
结果输出:
- [6, 7, 8]
示例 2:一个 Predicate 过滤数字集合中,数字大小在 5 至 9 之间的数字。
- List
numberList = Arrays.asList(3, 4, 5, 6, 7, 8, 9, 10); - numberList = numberList.stream().filter(x -> x > 5 && x < 9).collect(Collectors.toList());
- System.out.println(numberList);
输出结果;
- [6, 7, 8]
predicate.negate() 方法会返回一个与指定判断相反的 Predicate。
示例:过滤数字集合中,数字不大于 5 的数字。
- import java.util.Arrays;
- import java.util.List;
- import java.util.function.Predicate;
- import java.util.stream.Collectors;
- public class Java8PredicateNeagete {
- public static void main(String[] args) {
- List
numberList = Arrays.asList(3, 4, 5, 6, 7, 8, 9, 10); - Predicate
greaterThan5 = number -> number > 5; - numberList = numberList.stream().filter(greaterThan5.negate()).collect(Collectors.toList());
- System.out.println(numberList);
- }
- }
输出结果:
- [3, 4, 5]
示例:过滤数字集合中,数字小于等于 5,或者大于等于 9 的数字。
- import java.util.Arrays;
- import java.util.List;
- import java.util.function.Predicate;
- import java.util.stream.Collectors;
- public class Java8PredicateOr {
- public static void main(String[] args) {
- List
numberList = Arrays.asList(3, 4, 5, 6, 7, 8, 9, 10); - Predicate
lessThan5 = number -> number <= 5; - Predicate
greaterThan8 = number -> number >= 9; - numberList = numberList.stream().filter(lessThan5.or(greaterThan8)).collect(Collectors.toList());
- System.out.println(numberList);
- }
- }
输出结果:
- [3, 4, 5, 9, 10]
Predicate 的 or() ,and(),negate() 方法可以随意组合 Predicate,组合后的判断逻辑是从左到右,从前到后,顺次判断。
如:(数字小于 5 ).and (数字大于 9 ).negate()。
解:(数字小于 5 )AND (数字大于 9 ) 对于任意数字都得 false,false.negate() 取相反 得 true。
所以,此判断逻辑对于任意数字都为 true。
示例:Predicate 的 or() ,and(),negate() 方法组合使用。
- import java.util.ArrayList;
- import java.util.Arrays;
- import java.util.List;
- import java.util.function.Predicate;
- public class Java8PredicateChain {
- public static void main(String[] args) {
- List
numberList = Arrays.asList(3, 4, 5, 6, 7, 8, 9, 10); - Predicate
lessThan5 = number -> number <= 5; - Predicate
greaterThan9 = number -> number >= 9; - // 小于等于 5
- System.out.println(filter(numberList, lessThan5));
- // 大于 5
- System.out.println(filter(numberList, lessThan5.negate()));
- // 小于等于 5 或者大于等于 9
- System.out.println(filter(numberList, lessThan5.or(greaterThan9)));
- // ! (小于等于 5 AND 大于等于 9)
- System.out.println(filter(numberList, lessThan5.and(greaterThan9).negate()));
- }
- public static
List filter(List list, Predicate predicate) { - List
resultList = new ArrayList<>(); - for (T t : list) {
- if (predicate.test(t)) {
- resultList.add(t);
- }
- }
- return resultList;
- }
- }
输出结果:
- [3, 4, 5]
- [6, 7, 8, 9, 10]
- [3, 4, 5, 9, 10]
- [3, 4, 5, 6, 7, 8, 9, 10]
示例:过滤符合某些特征的狗。
- import java.util.ArrayList;
- import java.util.List;
- import java.util.function.Predicate;
- public class Java8PredicateObject {
- public static void main(String[] args) {
- List
dogList = new ArrayList<>(); - dogList.add(new Dog("哈士奇", 1));
- dogList.add(new Dog("牧羊犬", 2));
- dogList.add(new Dog("柯基", 3));
- dogList.add(new Dog("柴犬", 3));
- // 找到 3岁的狗
- System.out.println(filter(dogList, dog -> dog.getAge().equals(3)));
- // 找到哈士奇信息
- Predicate
predicate = dog -> ("哈士奇").equals(dog.getName()); - System.out.println(filter(dogList, predicate));
- }
- public static
List filter(List list, Predicate predicate) { - List
resultList = new ArrayList<>(); - for (T t : list) {
- if (predicate.test(t)) { resultList.add(t); }
- }
- return resultList;
- }
- }
- class Dog {
- private String name;
- private Integer age;
- public Dog(String name, Integer age) {
- this.name = name;
- this.age = age;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public Integer getAge() {
- return age;
- }
- public void setAge(Integer age) {
- this.age = age;
- }
- @Override
- public String toString() {
- return "Dog{" +
- "name='" + name + '\'' +
- ", age=" + age +
- '}';
- }
- }
输出结果:
- [Dog{name='柯基', age=3}, Dog{name='柴犬', age=3}]
- [Dog{name='哈士奇', age=1}]
BiPredicate 和 Predicate 函数接口一样,都是返回一个布尔类型,唯一不同的是 Predicate 接受一个参数,而 BiPredicate 可以接受两个不同类型的参数。
BiPredicate 在 Java 8 中源码:
- package java.util.function;
- import java.util.Objects;
- @FunctionalInterface
- public interface BiPredicate
{ - boolean test(T t, U u);
- default BiPredicate
and(BiPredicate super T, ? super U> other) { - Objects.requireNonNull(other);
- return (T t, U u) -> test(t, u) && other.test(t, u);
- }
- default BiPredicate
negate() { - return (T t, U u) -> !test(t, u);
- }
- default BiPredicate
or(BiPredicate super T, ? super U> other) { - Objects.requireNonNull(other);
- return (T t, U u) -> test(t, u) || other.test(t, u);
- }
- }
分享文章:Java8Predicate函数接口
文章网址:http://www.36103.cn/qtweb/news34/30384.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联