Java8中的Predicate和Consumer

原创 2018年04月17日 11:31:13

由于工作需求,最近了解了一下Java8中的Predicate和Consumer接口,在此浅谈一下对它们的理解和使用:

首先先来看一下Predicate官方文档解释:

直译:代表了对参数的断言(布尔值函数)。这是一个函数式接口,它的函数方法是test(Object).

这句话不是很好理解,我解释一下,Predicate翻译过来是“断言”、“断定”的意思,就是说它是会对输入参数进行判断,然后返回布尔值;这是一个函数式接口,通过它的test(Object)方法返回布尔值结果,关于什么是函数式接口,可自行Google或百度,不影响对其的理解,在此不作深究。

再看一下Consumer官方文档解释:

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

    This is a functional interface whose functional method is accept(Object).

直译:表示一个接受单个输入参数并不返回结果的操作。与大多数其他函数式接口不同,Consumer期望通过副作用操作。

          这是一个函数式接口,其功能方法是accept(Object)。

这里有一个关键词:side-effects,翻译过来是副作用,它指的是函数或表达式修改基本变量的行为,例如有两个int类型的变量x和y,x+y只是返回相加的结果,并没有改变x和y的值,那么这个操作就没有副作用;而赋值操作如x=1,由于将1赋值给x,改变了x的值,因此这个操作具有副作用。

简单来说就是Consumer接口并不返回任何值,而只是接收参数并将他们的状态通过副作用改变(其实就是个赋值操作)。

这里有一个很好的例子来展示这两个接口的使用场景:

例如对学生而言,Student类包含姓名,分数以及待付费用,每个学生可根据分数获得不同程度的费用折扣。

public class Student {
	String firstName;
	String lastName;
	Double grade;
	Double feeDiscount = 0.0;
	Double baseFee = 20000.0;

	public Student(String firstName, String lastName, Double grade) {
		this.firstName = firstName;
		this.lastName = lastName;
		this.grade = grade;
	}

	public void printFee() {
		Double newFee = baseFee - ((baseFee * feeDiscount) / 100);
		System.out.println("The fee after discount: " + newFee);
	}
}
import java.util.function.Consumer;
import java.util.function.Predicate;

import org.junit.Test;

public class PredicateConsumerDemo {
	public static Student updateStudentFee(Student student, Predicate<Student> predicate, Consumer<Student> consumer) {
		// Use the predicate to decide when to update the discount.
		if (predicate.test(student)) {
			// Use the Consumer to update the discount value.
			consumer.accept(student);
		}
		return student;
	}

	@Test
	public void test() {
		Student student1 = new Student("Ashok", "Kumar", 9.5);
		student1 = updateStudentFee(student1, new Predicate<Student>() {
			@Override
			public boolean test(Student t) {
				return t.grade > 8.5;
			}
		}, new Consumer<Student>() {
			@Override
			public void accept(Student t) {
				t.feeDiscount = 30.0;
			}
		});
		student1.printFee();

		Student student2 = new Student("Rajat", "Verma", 8.0);
		student2 = updateStudentFee(student2, student -> student.grade >= 8, student -> student.feeDiscount = 20.0);
		student2.printFee();
	}
}
例子摘抄并发编程网,点击打开链接

拒绝服务的侦测与预防

拒绝服务的侦测与预防Jacky网络经济的持续发展,电子商务观念也得到大多数人的认同之际,一向 在网络上从事窃取资料与捣乱的黑客也同样变得异常活跃。黑客的网络破坏行为每年可能会造成企业电子商务系统损失惨...
  • freeboy
  • freeboy
  • 2001-07-24 02:19:00
  • 614

Java JVM(七):Function,Consumer,Predicate 接口

包括 Funciton,Consumer,Predicate 接口的使用。
  • u014077165
  • u014077165
  • 2015-09-09 12:07:18
  • 7814

Java 8 - Predicate和Consumer接口函数式编程

Predicate函数编程 Consumer函数编程 Predicate功能判断输入的对象是否符合某个条件。官方文档解释到:Determines if the input object matches...
  • chuji2012
  • chuji2012
  • 2017-09-06 20:27:44
  • 1025

【java】【java8】Lambda、Stream、Function、Consumer、Predicate、Supplier

Function源代码 package java.util.function; import java.util.Objects; /** * Represents a function tha...
  • lzm18064126848
  • lzm18064126848
  • 2017-04-16 23:58:52
  • 2694

和Lambda表达式相关的Consumer、Function、Predicate 与 Supplier

http://openhome.cc/Gossip/Java/ConsumerFunctionPredicateSupplier.html Lambda表示式實際的型態要看函式介面,雖然可以自行...
  • hotdust
  • hotdust
  • 2016-11-07 16:39:15
  • 482

Java8新特性(一)------函数式编程

Ø  基本概念   理解FunctionalInterface(函数式接口,以下简称FI)是学习Java8 Lambda表达式的关键所在。FI的定义其实很简单:任何接口,如果只包含唯一 一个抽象方法,...
  • u010955843
  • u010955843
  • 2016-05-30 15:50:30
  • 537

JAVA8-Predicate函数使用

主要说明 常用方法 真实场景 主要说明Predicate 接受一个输入参数,返回一个布尔值结果。该接口包含多种默认方法来将Predicate组合成其他复杂的逻辑(比如:与,或,非)。可以用于接口请求参...
  • zhouquan_csdn
  • zhouquan_csdn
  • 2017-07-10 18:39:37
  • 3416

Java8 Consumer接口源码阅读

/** * 代表一个操作,这个操作接受单一输入参数并且不返回任何结果。不像其它大多数函数接口,Consumer被 * 期望通过副作用操作。(通过副作用操作时什么意思?) * *这是一个函数接口...
  • l294265421
  • l294265421
  • 2015-04-19 19:33:29
  • 2719

使用Java 8新增的Predicate操作来操作集合

Java 8为Collection集合新增了一些需要Predicate参数的方法,这些方法可以对集合元素进行过滤。程序可使用Lambda表达式构建Predicate对象。 1 代码示例 impor...
  • chengqiuming
  • chengqiuming
  • 2017-04-12 09:43:52
  • 7211

使用Java8新增的Predicate操作集合

使用Java8新增的Predicate操作集合: java8为Collection集合新增了一个removeIf(Predicate filter) 方法,该方法将会批量删除符合filter条件的...
  • zlz18225318697
  • zlz18225318697
  • 2016-09-20 18:13:39
  • 2759
收藏助手
不良信息举报
您举报文章:Java8中的Predicate和Consumer
举报原因:
原因补充:

(最多只允许输入30个字)