java8 函数编程Consumer使用详解

Consumer 源码

package java.util.function;import java.util.Objects;@FunctionalInterface
public interface Consumer<T> {void accept(T t);default Consumer<T> andThen(Consumer<? super T> after) {Objects.requireNonNull(after);return (T t) -> { accept(t); after.accept(t); };}
}

从源码来看,Consumer函数主要有两个方法,accept和andThen。

Consumer 使用

演示一

建立演示方法:

    public static void t1(){Consumer<Integer> cal=x-> {x=x*10;System.out.println(x);};cal.accept(20);}

执行结果:

200

演示二

创建一个car汽车类

/*** 汽车*/
public class Car {private String name;private String company;/*** 设置名称并返回当前对象* @param name* @return*/public Car setName(String name){this.name=name;return this;}/*** 设置公司并返回当前类* @param company* @return*/public Car setCompany(String company){this.company=company;return this;}@Overridepublic String toString() {return "name:"+name+" company:"+company;}
}

创建演示方法:

    public static void t2(Consumer<Car> consumer){Car car=new Car();consumer.accept(car);System.out.println(car.toString());}public static void main(String[] args) {t2(Car->Car.setName("长安cs 85").setCompany("长安"));}

执行结果:

name:长安cs 85 company:长安

演示三

    public static void t3(){Consumer<Car> setNameFn=car -> {car.setName("长城H6汽车");};Consumer<Car> setCompanyFn=car -> {car.setCompany("长城公司");};Car car1=new Car();setNameFn.accept(car1);System.out.println(car1);Car car2=new Car();//使用andThen链接多个函数执行setNameFn.andThen(setCompanyFn).accept(car2);System.out.println(car2);}

执行结果:

name:长城H6汽车 company:null
name:长城H6汽车 company:长城公司

consumer从字面上面来理解就是消费的意思,用过mq的,应该大概可以了解到意思。

我们先来看看Java8定义的这个consumer的接口:

@FunctionalInterface
public interface Consumer<T> {void accept(T t);default Consumer<T> andThen(Consumer<? super T> after) {Objects.requireNonNull(after);return (T t) -> { accept(t); after.accept(t); };}
}

该接口被@FunctionalInterface注解修饰,这个注解的意思代表的是这个接口只有一个抽象接口方法,如果超过一个,只不能不用该接口,会编译不通过。

该接口有一个抽象方法accept,接受的是泛型T的一个参数类型,这个方法是在consumer的实例显示被调用之后,那么指定的函数式表达式才会被执行,请看下面例子:​​​​​​​

// 构造函数式表达,并赋值于consumer对象,其中此时泛型已经被指定为Integer了
// 所以此时调用accept方法时,传入的对象必须一一对应传入Integer类型
Consumer<Integer> consumer = x -> {int a = x + 2;System.out.println(a);// 12System.out.println(a + "_");// 12_};// 显示调用,consumer中的函数式方法才会调用,可以理解为预先// 定义好要执行的代码逻辑,等到要执行的时候才显示的执行,这在项目中// 的需求还是很大,比如数据还没有到达,则此时可以等到数据到达之后才调用consumer.accept(10);

该接口方法还有另外一个默认实现方法andThen,从方法名很容易知道,先执行本接口方法的accept方法,之后再执行after的accept方法,请看下面代码:​​​​​​​

/**传入一个Consumer类型的参数,*他的泛型类型,*跟本接口是一致的T,先做本接口的accept操作,*然后在做传入的Consumer类型的参数的accept操作*/default Consumer<T> andThen(Consumer<? super T> after) {Objects.requireNonNull(after);return (T t) -> { accept(t); after.accept(t); };}

例子:​​​​​​​

public class TestConsumer {public static void main(String[] args) {// 定义第一个consumer表达式Consumer<Integer> consumer = x -> {int a = x + 2;System.out.println(a);// 8System.out.println(a + "_");// 8_};// 定义第二个consumer表达式Consumer<Integer> after = x -> {int a = x * 2;System.out.println(a);// 12System.out.println(a + "_");// 12_};// 调用方式,先执行第一个consumer表达式,执行完之后将参数直接传递给// 后面的after表达式继续执行,这个场景可以用于相同入参不同方法先后执行顺序,consumer.andThen(after).accept(6);}
}

运行结果:

88_1212_

consumer是一个函数式接口(可以采用lambda写法),它的源码如下

@FunctionalInterface
public interface Consumer<T> {void accept(T t);default Consumer<T> andThen(Consumer<? super T> after) {Objects.requireNonNull(after);return (T t) -> { accept(t); after.accept(t); };}
}

consumer的具体的使用场景就是可以提前记录我们的某些操作,然后在后面再去执行,比如说:当我们在a方法中,需要把某些参数赋值给一个Integer类型的对象,而该对象只有在b方法才能赋值,那么我们可以在a方法中使用consumer记录我们要执行的操作,再把consumer作为参数传递到b方法执行,多种操作可以用该接口的default方法addThen来持续记录

a(int x, int y){Consumer<Integer> consumer = null;consumer = z -> z = x + 2;consumer.addThen(z -> z -= y);b(consumer);
}b(Consumer<Integer> consumer){Integer z = 0;consumer.accept(z);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/554931.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java解析vue对象数组,Java数组

Java提供了一个数据结构&#xff0c;所述数组&#xff0c;其存储相同类型的元件的固定大小的连续集合。数组用于存储数据集合&#xff0c;但将数组视为相同类型变量的集合通常更为有用。您可以声明一个数组变量&#xff0c;例如数字和数字[0]&#xff0c;数字[1]和...&#xff…

Java中List的subList()方法及使用注意事项

List<Object> list new Arraylist<>();List<Object> subList list.subList(0, 5);其中subList(0, 5)取得的是下标为0到4的元素,不包含下标为5的元素. java.util.List中的subList方法返回列表中指定的 fromIndex&#xff08;包括 &#xff09;和 toIndex&a…

php有关卡的消消乐源码,查看“宝可消消乐/活动关卡/得分挑战关卡/超梦”的源代码...

因为以下原因&#xff0c;您没有权限编辑本页&#xff1a;您所请求的操作仅限于该用户组的用户使用&#xff1a;用户您可以查看与复制此页面的源代码。关卡{| {{classcolortable|type|psychic|widthfull}}|{{Shuffle Stage| stage 得分挑战关卡| name 超梦| number 150| for…

SpringBoot操作hbase

1&#xff0c;添加依赖&#xff08;客户端版本和 HBase 版本需要保持一致&#xff0c;否则可能会遇到不兼容的问题。&#xff09; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId>&…

php 域名白名单,域名白名单验证

验证域名是否在白名单中是编程时常用到的功能&#xff0c;对安全性有要求的项目中都有该功能。常见的使用场景有登录后回跳&#xff0c;跳转到外站时弹出安全提示等。知乎登录后回跳&#xff1b;只要有登录的地方就需要用到来源回跳。我们在一个页面www.baidu.com 调用知乎的登…

Java Socket与Html5 websocket通信

一、Mysocket.java文件 import org.springframework.stereotype.Component;import javax.websocket.*; import javax.websocket.server.*;// ws://localhost:8080/ws/Tom ServerEndpoint("/ws/{user}") Component public class MySocket {private String currentUse…

matlab 由移相角如何产生移相脉冲,整流电路控制角移相范围是怎么确定的?

整流电路控制角移相范围是怎么确定的&#xff1f;2019-03-14【FrancisQu的回答(28票)】:谢邀^^一言以蔽之&#xff0c;整流电路控制角的范围取决于整流电路直流输出电压平均值时所得的控制角&#xff0c;详细分析如下。基本概念&#xff1a;触发延迟角(控制角)——从晶闸管开始…

php编程对联,形容程序员的对联大全

程序员&#xff0c;是从事程序开发、维护的专业人员。现在有一些形容程序员的对联&#xff0c;学习啦小编为大家整理了一些&#xff0c;感兴趣的&#xff0c;欢迎大家阅读。形容程序员的对联摘抄上联&#xff1a;莫道运维无姝丽&#xff0c;下联&#xff1a;谁言开发不风情?横…

SpringBoot 实现SSE 服务器发送事件

SSE 全称Server Sent Event&#xff0c;直译一下就是服务器发送事件&#xff0c;一般的项目开发中&#xff0c;用到的机会不多&#xff0c;可能很多小伙伴不太清楚这个东西&#xff0c;到底是干啥的&#xff0c;有啥用 本文主要知识点如下&#xff1a; SSE 扫盲&#xff0c;应…

php多表递归查询,使用公用表表达式的递归查询

微软从SQL2005起引入了CTE(Common Table Expression)以强化T-SQL。公用表表达式 (CTE) 具有一个重要的优点&#xff0c;那就是能够引用其自身&#xff0c;从而创建递归 CTE。递归 CTE 是一个重复执行初始 CTE 以返回数据子集直到获取完整结果集的公用表表达式。当某个查询引用递…

php如何把图片存入oracle,在PHP中将图片存放ORACLE中

我这里提供一个用PHP操纵blob字段的例子给你&#xff0c;希望能有所帮助&#xff01;这个例子是把用户上传的图片文件存放到BLOB中。假设有一个表&#xff0c;结构如下&#xff1a;CREATE TABLE PICTURES (ID NUMBER,DESCRIPTION VARCHAR2(100),PICTURE BLOB);然后是用来处理数…

Springboot之整合SSE实现消息推送

Springboot之整合SSE实现消息推送 前言 项目中涉及到部分请求&#xff0c;后端处理时间较长&#xff0c;使用常规Http请求&#xff0c;页面等待时间太长&#xff0c;对用户不友好&#xff0c;故考虑使用长链接进行消息推送&#xff0c;可选方案有WebSocket、SSE&#xff0c;We…

SQL按某字段去重 保留按某个字段排序最大值

select * from tablename as a where not exists ( select 1 from tablename as bwhere b.namea.name and b.id>a.id)talename&#xff1a;要去重复的表 name:需要去重复的字段&#xff0c;可以有多个字段 ID&#xff1a;取id字段最大 例子&#xff1a; create table ta…

oracle将字符串的日期格式化,oracle格式化字符串 oracle 怎么把字符串转换成日期...

Oracle数据库中如何将字符串格式化为日期可以用 to_date(日期类型字符串,要转化的日期类型)函数进行日期格式转换 sql&#xff1a;select to_date(1990-12-12 12:12:32,yyyy-MM-dd hh24:mi:ss) from dual; 解释&#xff1a;此语句的输出结果就是 “1990-12-12 12:12:32”(日期类…

SQL中只要用到聚合函数就一定要用到group by 吗?

SQL中只要用到聚合函数就一定要用到group by 吗? 今天记录一个弱智问题&#xff0c;一直没发现这个问题。 答&#xff1a;看情况 1、当聚集函数和非聚集函数出现在一起时&#xff0c;需要将非聚集函数进行group by 2、当只做聚集函数查询时候&#xff0c;就不需要进行分组了…

oracle排名怎么去除空值影响,Oracle排序中常用的NULL值处理方法

1、缺省处理Oracle在Order by 时缺省认为null是最大值&#xff0c;所以如果是ASC升序则排在最后&#xff0c;DESC降序则排在最前2、使用nvl函数nvl函数可以将输入参数为空时转换为一特定值&#xff0c;如nvl(employee_name,’张三’)表示当employee_name为空时则返回’张三’&a…

Vue中npm run dev 和 npm run serve区别

在运行vue文件时&#xff0c;需要进行npm操作&#xff0c;但我们发现&#xff0c;有时候用的是npm run serve&#xff0c;而有的时候用的是npm run dev&#xff0c;二者有什么区别 在我们运行一些 vue 项目的时候&#xff0c;输入npm run serve或者 npm run dev的其中一个时&a…

SpringBoot导出数据为PDF

一、SpringBoot导出数据为PDF 1、添加所需依赖 <dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.11</version> </dependency> <dependency><groupId>com.itextpdf.…

php安装mem+cache扩展,安装memcached及php扩展

用的是centos系统1、安装memcachedyum -y install memcached安装完成后&#xff0c;memcached -h应该会出现memcached 参数说明2、memcached配置文件vi /etc/sysconfig/memcachedPORT"11210"USER"memcached"MAXCONN"1024"CACHESIZE"64"…

Springboot集成支付宝沙箱支付(完整版)

开发前准备 easy支付官方文档&#xff1a;https://opendocs.alipay.com/open/009ys9 通用版文档&#xff1a;https://opendocs.alipay.com/open/02np94 支付宝沙箱的配置 注册支付宝开发者账户&#xff0c;进入开发者控制台 https://openhome.alipay.com/platform/developer…