Predicate和Consumer接口– Java 8中java.util.function包下的接口

简介:

早先我写了一篇《函数式接口》,探讨了部分Java 8中函数式接口的用法。我也提及了Predicate接口属于java.util.function包,在这篇文章中,我将展示如何应用Predicate接口和Consumer接口。

一起看一下Predicate的官方文档:

Determines if the input object matches some criteria.

即判断输入的对象是否符合某个条件。

在Predicate接口中,有以下5个方法(你肯定好奇为何此接口属于函数式接口。如果你这么想,在使用接口前应该好好研读方法的注释):

01 //Returns a predicate which evaluates to true only if this predicate
02 //and the provided predicate both evaluate to true.
03 and(Predicate<? super T> p) 
04  
05 //Returns a predicate which negates the result of this predicate.
06 negate() 
07  
08 //Returns a predicate which evaluates to true if either
09 //this predicate or the provided predicate evaluates to true
10 or(Predicate<? super T> p) 
11  
12 //Returns true if the input object matches some criteria
13 test(T t) 
14  
15 //Returns a predicate that evaluates to true if both or neither
16 //of the component predicates evaluate to true
17 xor(Predicate<? super T> p)

除了test()方法是抽象方法以外,其他方法都是默认方法(译者注:在Java 8中,接口可以包含带有实现代码的方法,这些方法称为default方法)。可以使用匿名内部类提供test()方法的实现,也可以使用lambda表达式实现test()。

Consumer接口的文档声明如下:

An operation which accepts a single input argument and returns no result. Unlike most other functional interfaces, Consumer is expected to operate via side-effects.

即接口表示一个接受单个输入参数并且没有返回值的操作。不像其他函数式接口,Consumer接口期望执行带有副作用的操作(译者注:Consumer的操作可能会更改输入参数的内部状态)。

Consumer接口中有2个方法,有且只有一个声明为accept(T t)的方法,接收一个输入参数并且没有返回值。为了详细说明Predicate和Consumer接口,我们来考虑一下学生的例子:Student类包含姓名,分数以及待付费用,每个学生可根据分数获得不同程度的费用折扣。

01 class Student{
02  
03     String firstName;
04  
05     String lastName;
06  
07     Double grade;
08  
09     Double feeDiscount = 0.0;
10  
11     Double baseFee = 20000.0;
12  
13     public Student(String firstName, String lastName, Double grade) {
14  
15         this.firstName = firstName;
16  
17         this.lastName = lastName;
18  
19         this.grade = grade;
20     }
21  
22     public void printFee(){
23  
24         Double newFee = baseFee - ((baseFee * feeDiscount) / 100);
25  
26         System.out.println("The fee after discount: " + newFee);
27  
28     }
29  
30 }

我们分别声明一个接受Student对象的Predicate接口以及Consumer接口的实现类。如果你还不熟悉Function接口,那么你需要花几分钟阅读一下这篇文章。这个例子使用Predicate接口实现类的test()方法判断输入的Student对象是否拥有费用打折的资格,然后使用Consumer接口的实现类更新输入的Student对象的折扣。

01 public class PreidcateConsumerDemo {
02  
03    public static Student updateStudentFee(Student student, Predicate<Student> predicate, Consumer<Student> consumer){
04  
05         //Use the predicate to decide when to update the discount.
06  
07         if ( predicate.test(student)){
08  
09             //Use the consumer to update the discount value.
10  
11             consumer.accept(student);
12         }
13  
14         return student;
15  
16     }
17  
18 }

Predicate和Consumer接口的test()和accept()方法都接受一个泛型参数。不同的是test()方法进行某些逻辑判断并返回一个boolean值,而accept()接受并改变某个对象的内部值。updateStudentFee方法的调用如下所示:

01 public static void main(String[] args) {
02  
03     Student student1 = new Student("Ashok","Kumar"9.5);
04  
05     student1 = updateStudentFee(student1,
06                                 //Lambda expression for Predicate interface
07                                 student -> student.grade > 8.5,
08                                 //Lambda expression for Consumer inerface
09                                 student -> student.feeDiscount = 30.0);
10  
11     student1.printFee();
12  
13     Student student2 = new Student("Rajat","Verma"8.0);
14  
15     student2 = updateStudentFee(student2,
16                                 student -> student.grade >= 8,
17                                 student -> student.feeDiscount = 20.0);
18  
19     student2.printFee();
20  
21 }
相关文章
|
2月前
|
数据采集 JSON Java
Java爬虫获取1688店铺所有商品接口数据实战指南
本文介绍如何使用Java爬虫技术高效获取1688店铺商品信息,涵盖环境搭建、API调用、签名生成及数据抓取全流程,并附完整代码示例,助力市场分析与选品决策。
|
2月前
|
存储 缓存 安全
Java集合框架(二):Set接口与哈希表原理
本文深入解析Java中Set集合的工作原理及其实现机制,涵盖HashSet、LinkedHashSet和TreeSet三大实现类。从Set接口的特性出发,对比List理解去重机制,并详解哈希表原理、hashCode与equals方法的作用。进一步剖析HashSet的底层HashMap实现、LinkedHashSet的双向链表维护顺序特性,以及TreeSet基于红黑树的排序功能。文章还包含性能对比、自定义对象去重、集合运算实战和线程安全方案,帮助读者全面掌握Set的应用与选择策略。
164 23
|
2月前
|
安全 Java 开发者
Java集合框架:详解Deque接口的栈操作方法全集
理解和掌握这些方法对于实现像浏览器后退功能这样的栈操作来说至关重要,它们能够帮助开发者编写既高效又稳定的应用程序。此外,在多线程环境中想保证线程安全,可以考虑使用ConcurrentLinkedDeque,它是Deque的线程安全版本,尽管它并未直接实现栈操作的方法,但是Deque的接口方法可以相对应地使用。
129 12
|
2月前
|
存储 安全 Java
Java集合框架(一):List接口及其实现类剖析
本文深入解析Java中List集合的实现原理,涵盖ArrayList的动态数组机制、LinkedList的链表结构、Vector与Stack的线程安全性及其不推荐使用的原因,对比了不同实现的性能与适用场景,帮助开发者根据实际需求选择合适的List实现。
|
2月前
|
Java API 网络架构
java调用api接口自动判断节假日信息
java调用api接口自动判断节假日信息
709 0
|
6月前
|
人工智能 Python
083_类_对象_成员方法_method_函数_function_isinstance
本内容主要讲解Python中的数据类型与面向对象基础。回顾了变量类型(如字符串`str`和整型`int`)及其相互转换,探讨了加法在不同类型中的表现。通过超市商品分类比喻,引出“类型”概念,并深入解析类(class)与对象(object)的关系,例如具体橘子是橘子类的实例。还介绍了`isinstance`函数判断类型、`type`与`help`探索类型属性,以及`str`和`int`的不同方法。最终总结类是抽象类型,对象是其实例,不同类型的对象有独特运算和方法,为后续学习埋下伏笔。
114 7
083_类_对象_成员方法_method_函数_function_isinstance
|
6月前
|
Python
[oeasy]python086方法_method_函数_function_区别
本文详细解析了Python中方法(method)与函数(function)的区别。通过回顾列表操作如`append`,以及随机模块的使用,介绍了方法作为类的成员需要通过实例调用的特点。对比内建函数如`print`和`input`,它们无需对象即可直接调用。总结指出方法需基于对象调用且包含`self`参数,而函数独立存在无需`self`。最后提供了学习资源链接,方便进一步探索。
123 17
|
6月前
|
人工智能 Python
[oeasy]python083_类_对象_成员方法_method_函数_function_isinstance
本文介绍了Python中类、对象、成员方法及函数的概念。通过超市商品分类的例子,形象地解释了“类型”的概念,如整型(int)和字符串(str)是两种不同的数据类型。整型对象支持数字求和,字符串对象支持拼接。使用`isinstance`函数可以判断对象是否属于特定类型,例如判断变量是否为整型。此外,还探讨了面向对象编程(OOP)与面向过程编程的区别,并简要介绍了`type`和`help`函数的用法。最后总结指出,不同类型的对象有不同的运算和方法,如字符串有`find`和`index`方法,而整型没有。更多内容可参考文末提供的蓝桥、GitHub和Gitee链接。
128 11
|
12月前
|
JavaScript
箭头函数与普通函数(function)的区别
箭头函数是ES6引入的新特性,与传统函数相比,它有更简洁的语法,且没有自己的this、arguments、super或new.target绑定,而是继承自外层作用域。箭头函数不适用于构造函数,不能使用new关键字调用。

热门文章

最新文章