同学你好,这里有一份你的未读代码,等你查收。

这篇文章属于 Java 8 教程(LTS)系列教程,点击阅读更多相关文章。

Predicate 函数接口同之前介绍的 Function 接口一样,是一个函数式接口,它可以接受一个泛型 <T> 参数,返回值为布尔类型Predicate 常用于数据过滤,如过滤出集合中符合某个条件的元素。

源码:Java 8 中函数接口 Predicate

package java.util.function;

import java.util.Objects;

@FunctionalInterface
public interface Predicate<T> { boolean test(T t); default Predicate<T> and(Predicate<? super T> other) {
Objects.requireNonNull(other);
return (t) -> test(t) && other.test(t);
} default Predicate<T> negate() {
return (t) -> !test(t);
} default Predicate<T> or(Predicate<? super T> other) {
Objects.requireNonNull(other);
return (t) -> test(t) || other.test(t);
} static <T> Predicate<T> isEqual(Object targetRef) {
return (null == targetRef)
? Objects::isNull
: object -> targetRef.equals(object);
}
}

1. Predicate test

Predicate 函数接口可以用于判断一个参数是否符合某个条件。

示例:判断某个字符串是否为空。

import java.util.function.Predicate;

public class Java8PredicateTest {
public static void main(String[] args) {
Predicate<String> isEmpty = String::isEmpty;
System.out.println(isEmpty.test(""));
System.out.println(isEmpty.test("www.wdbyte.com"));
}
}

输出结果:

true
false

2. Predicate Stream filter

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<String> 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]

3. Predicate and

使用 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<Integer> numberList = Arrays.asList(3, 4, 5, 6, 7, 8, 9, 10); Predicate<Integer> greaterThan5 = number -> number > 5;
Predicate<Integer> lessThan9 = number -> number < 9;
Predicate<Integer> filter = greaterThan5.and(lessThan9); numberList = numberList.stream().filter(filter).collect(Collectors.toList());
System.out.println(numberList);
}
}

结果输出:

[6, 7, 8]

示例 2:一个 Predicate 过滤数字集合中,数字大小在 5 至 9 之间的数字。

List<Integer> 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]

4. Predicate negate

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<Integer> numberList = Arrays.asList(3, 4, 5, 6, 7, 8, 9, 10);        Predicate<Integer> greaterThan5 = number -> number > 5;        numberList = numberList.stream().filter(greaterThan5.negate()).collect(Collectors.toList());        System.out.println(numberList);    }}

输出结果:

[3, 4, 5]

5. Predicate or

示例:过滤数字集合中,数字小于等于 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<Integer> numberList = Arrays.asList(3, 4, 5, 6, 7, 8, 9, 10);        Predicate<Integer> lessThan5 = number -> number <= 5;        Predicate<Integer> greaterThan8 = number -> number >= 9;        numberList = numberList.stream().filter(lessThan5.or(greaterThan8)).collect(Collectors.toList());        System.out.println(numberList);    }}

输出结果:

[3, 4, 5, 9, 10]

6. Predicate 链式编程

Predicateor()and()negate() 方法可以随意组合 Predicate,组合后的判断逻辑是从左到右,从前到后,顺次判断。

:(数字小于 5 ).and (数字大于 9 ).negate()

:(数字小于 5 )AND (数字大于 9 ) 对于任意数字都得 falsefalse.negate() 取相反 得 true

所以,此判断逻辑对于任意数字都为 true

示例Predicateor()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<Integer> numberList = Arrays.asList(3, 4, 5, 6, 7, 8, 9, 10);        Predicate<Integer> lessThan5 = number -> number <= 5;        Predicate<Integer> 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 <T> List<T> filter(List<T> list, Predicate<T> predicate) {        List<T> 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]

7. Predicate 与对象

示例:过滤符合某些特征的狗。

import java.util.ArrayList;import java.util.List;import java.util.function.Predicate;public class Java8PredicateObject {    public static void main(String[] args) {        List<Dog> 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<Dog> predicate = dog -> ("哈士奇").equals(dog.getName());        System.out.println(filter(dogList, predicate));    }    public static <T> List<T> filter(List<T> list, Predicate<T> predicate) {        List<T> 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}]

BiPredicatePredicate 函数接口一样,都是返回一个布尔类型,唯一不同的是 Predicate 接受一个参数,而 BiPredicate 可以接受两个不同类型的参数。

BiPredicate 在 Java 8 中源码:

package java.util.function;

import java.util.Objects;
@FunctionalInterface
public interface BiPredicate<T, U> {
boolean test(T t, U u); default BiPredicate<T, U> and(BiPredicate<? super T, ? super U> other) {
Objects.requireNonNull(other);
return (T t, U u) -> test(t, u) && other.test(t, u);
} default BiPredicate<T, U> negate() {
return (T t, U u) -> !test(t, u);
} default BiPredicate<T, U> or(BiPredicate<? super T, ? super U> other) {
Objects.requireNonNull(other);
return (T t, U u) -> test(t, u) || other.test(t, u);
}
}

扩展阅读

Java 8 Function 函数接口

Java 8 Predicate 函数接口

Java 8 Consumer 函数接口

Java 8 Supplier 函数接口

Java 8 BiFunction 函数接口

Java 8 BiPredicate 函数接口

Java 8 UnaryOperator 函数接口

参考

BiPredicate (Java Platform SE 8 )

Predicate (Java Platform SE 8 )

Java 8 Predicate 函数接口

这篇文章就到这里了,我是一个想认认真真写写文章的爱折腾的程序猿。

如果想要订阅,可以关注公众号 “未读代码 ,或者未读代码博客,或者加我微信( wn8398)

本文也已经整理到 GitHub.com/niumoo/JavaNotes,欢迎 Star。

还不了解一下 Java 8 Predicate 函数接口的更多相关文章

  1. Java 8 Function 函数接口

    这篇文章属于 Java 8 教程(LTS)系列教程 在 Java 8 中,Function 接口是一个函数接口,它位于包 java.util.function 下. Function 接口中定义了一个 ...

  2. java8 函数接口 Predicate例子

    import java.util.HashSet; import java.util.Collection; import java.util.function.Predicate; public c ...

  3. Java 8 函数接口详细教程

    ay = new byte[array.length]; for (int i = 0; i < array.length; i++) { transformedArray[i] = funct ...

  4. 还看不懂同事的代码?Lambda 表达式、函数接口了解一下

    当前时间:2019年 11月 11日,距离 JDK 14 发布时间(2020年3月17日)还有多少天? // 距离JDK 14 发布还有多少天? LocalDate jdk14 = LocalDate ...

  5. Lambda函数接口和方法构造器应用

    函数式接口 什么是函数式接口? 在java中'有且仅有一个抽象方法的接口',就称为函数式接口. 可以通过Lambda表达式来创建该接口的对象.(若Lambda表达式抛出一个受检异常,那么该异常需要在目 ...

  6. Java学习:常用函数接口

    常用函数接口 什么是函数式接口? 函数式接口,@FunctionalInterface,简称FI,简单的说,FI就是指仅含有一个抽象方法的接口,以@Functionalnterface标注 注意:这里 ...

  7. 【Java 8】函数式接口(二)—— 四大函数接口介绍

    前言 Java8中函数接口有很多,大概有几十个吧,具体究竟是多少我也数不清,所以一开始看的时候感觉一脸懵逼,不过其实根本没那么复杂,毕竟不应该也没必要把一个东西设计的很复杂. 几个单词 在学习了解之前 ...

  8. 使用Java函数接口及lambda表达式隔离和模拟外部依赖更容易滴单测

    概述 单测是提升软件质量的有力手段.然而,由于编程语言上的支持不力,以及一些不好的编程习惯,导致编写单测很困难. 最容易理解最容易编写的单测,莫过于独立函数的单测.所谓独立函数,就是只依赖于传入的参数 ...

  9. Java函数接口实现函数组合及装饰器模式

    摘要: 通过求解 (sinx)^2 + (cosx)^2 = 1 的若干写法,逐步展示了如何从过程式的写法转变到函数式的写法,并说明了编写"[接受函数参数]并返回[能够接受函数参数的函数]的 ...

随机推荐

  1. zookeeper集群及kafka集群搭建

    1.zookeeper集群搭建 1.1 上传安装包 官网推荐至少3个节点,我们这里也用三个节点192.169.2.18  192.169.1.82  192.169.1.95 准备好安装包,zooke ...

  2. Java基础-封装和继承

    @ 目录 Java基础知识(封装和继承) 一. 封装 1.1 封装的目的 1.2 封装的好处 1.3 封装的步骤 1.4 封装的例子 1.5 小结 二. 继承 2.1 继承的介绍 2.2 生活中的继承 ...

  3. delphi xe 10.3 利用Git组群开发,Git服务器安装,Git 拉取,提交,推送相关设置操作

    1. Git服务器安装, 参考 https://blog.csdn.net/u012842630/article/details/97175397 Git服务器官方网站,要FQ. 2. 工具软件 gi ...

  4. 用Java语言编写的迷宫小游戏软件

    可查看本项目的github 源码链接,撒娇打滚求 star 哦~~ღ( ´・ᴗ・ ` )比心 本仓库代码是经过 eclipse 编译运行过的,一般情况下将本仓库代码下载下来之后,使用 eclipse ...

  5. 《手把手教你》系列基础篇(五)-java+ selenium自动化测试- 创建首个自动化脚本(详细教程)

    1.简介 前面几篇宏哥介绍了两种(java和maven)环境搭建和三大浏览器的启动方法,这篇文章宏哥将要介绍第一个自动化测试脚本.前边环境都搭建成功了,浏览器也驱动成功了,那么我们不着急学习其他内容, ...

  6. kerberos认证协议爱情故事

    0x01.kerberos简介 kerberos是一种域内认证协议,Kerberos的标志是三头狗,狗头分别代表以下角色: Client Server KDC(Key Distribution Cen ...

  7. Redis 底层数据结构之字典

    文章参考 <Redis 设计与实现>黄建宏 字典 在字典中,每个键都是独一无二的,程序可以在字典中根据键查找与之相关联的值,或者通过键来更新和删除值. 字典在 Redis 中的应用相当广泛 ...

  8. 基于Linux的校园网破解思路和方法

    #思路: ##1. 当校园网断开,只需要重新拨号即可 ##2. 校园网使用两台电脑同时登录时不会立即下线,其中有一段时间间隔 #步骤: ##1. 通过抓包对拨号产生的数据包进行分析,使得可以通过代码来 ...

  9. robotframework使用过程中的一些总结

    p.p1 { margin: 0; font: 20px "Helvetica Neue"; color: rgba(53, 53, 53, 1) } p.p2 { margin: ...

  10. Java 设置PDF跨页表格重复显示表头行

    在创建表格时,如果表格内容出现跨页显示的时候,默认情况下该表格的表头不会在下一页显示,在阅读体验上不是很好.下面分享一个方法如何在表格跨页是显示表格的表头内容,这里只需要简单使用方法 grid.set ...