Java8 BiConsumer<T, U> 函数接口浅析分享(含示例,来戳!)
文章目录
- Java8 BiConsumer<T, U> 函数接口浅析分享(含示例,来戳!)
- 源码
- accept 方法示例
- 示例一
- 示例二
- andThen 方法示例
- 示例一
- 示例二
- 示例相关代码类
- dohandler 方法
- student.java
- StudentScore.java
- StudentScoreDto.java
Java8 BiConsumer<T, U> 函数接口浅析分享(含示例,来戳!)
💗💗💗您的点赞、收藏、评论是博主输出优质文章的的动力!!!💗💗💗
欢迎在评论区与博主沟通交流!!Java8 系列文章持续更新,大佬们关注我!种个草不亏!👇🏻 👇🏻 👇🏻
学起来,开整!Java8 BiConsumer<T, U>函数接口使用分享。
BiConsumer<T, U> 跟我们熟悉的 Consumer< T> 很像,核心思想也是一样的,两者都是表达消费的意思;
源码
BiConsumer<T, U> 提供了两个方法:
- void accept(T t, U u):传入两个泛型参数(当然方法实现想怎么用自己玩,可以看下面示例场景);
- BiConsumer<T, U> andThen(BiConsumer<? super T, ? super U> after):可以理解为在执行 accept 方法前先执行一个前置方法,前置方法执行完成后,会接着执行 accept 方法;
源码
@FunctionalInterface
public interface BiConsumer<T, U> {void accept(T t, U u);default BiConsumer<T, U> andThen(BiConsumer<? super T, ? super U> after) {Objects.requireNonNull(after);return (l, r) -> {accept(l, r);after.accept(l, r);};}
}
accept 方法示例
tips: 需要配合文末示例相关代码类食用
示例一
查询所有学生的成绩:
@Testpublic void test() {StudentScoreDto studentScoreDto = new StudentScoreDto();Student student = new Student();this.doHandler(student, studentScoreDto, StudentAssemble::queryList, StudentAssemble::calcSort);System.out.println(JSONObject.toJSONString(studentScoreDto));}
执行结果:

示例二
查询 “张三” 同学的成绩:
@Testpublic void test() {StudentScoreDto studentScoreDto1 = new StudentScoreDto();Student student1 = new Student();student1.setName("张三");this.doHandler(student1, studentScoreDto1, StudentAssemble::queryList, StudentAssemble::calcSort);System.out.println(JSONObject.toJSONString(studentScoreDto1));}
执行结果:

andThen 方法示例
示例一

查询所有学生的成绩,并且输出第一名是哪位同学;
@Testpublic void test() {StudentScoreDto studentScoreDto2 = new StudentScoreDto();Student student2 = new Student();this.doHandler(student2, studentScoreDto2, StudentAssemble::queryList, StudentAssemble::calcSort, StudentAssemble::findFirst);System.out.println(JSONObject.toJSONString(studentScoreDto2));}
执行结果:
示例二
查询所有学生的成绩,并且输出 “李四” 同学的排名和总分;
@Testpublic void test() {StudentScoreDto studentScoreDto3 = new StudentScoreDto();studentScoreDto3.setName("李四");Student student3 = new Student();this.doHandler(student3, studentScoreDto3, StudentAssemble::queryList, StudentAssemble::calcSort, StudentAssemble::findFirst);System.out.println(JSONObject.toJSONString(studentScoreDto3));}
执行结果:

示例相关代码类
tips: 需要配合文末示例相关代码类食用
dohandler 方法
tip:注意这里是方法!!
public void doHandler(Student student,StudentScoreDto dto,Function<Student, List<StudentScore>> func1,BiConsumer<List<StudentScore>, StudentScoreDto> func2) {List<StudentScore> apply = func1.apply(student);func2.accept(apply, dto);}public void doHandler(Student student,StudentScoreDto dto,Function<Student, List<StudentScore>> func1,BiConsumer<List<StudentScore>, StudentScoreDto> func2,BiConsumer<List<StudentScore>, StudentScoreDto> func3) {List<StudentScore> apply = func1.apply(student);func2.accept(apply, dto);func3.andThen(func2).accept(apply, dto);}
student.java
@AllArgsConstructor
@NoArgsConstructor
@Data
public class Student {/*** 姓名*/private String name;/*** 年龄*/private Integer age;/*** 生日*/@JSONField(format="yyyy-MM-dd HH:mm:ss")private Date birthday;/*** 学号*/private Integer num;@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +", birthday=" + birthday +", num=" + num +'}';}
StudentScore.java
@AllArgsConstructor
@NoArgsConstructor
@Data
public class StudentScore {/*** 名称*/private String name;/*** 科目*/private String subject;/*** 成绩*/private Integer score;}
StudentScoreDto.java
@AllArgsConstructor
@NoArgsConstructor
@Data
public class StudentScoreDto {/*** 名称*/private String name;/*** 科目*/private String subject;/*** 成绩*/private Integer score;/*** 个人排名*/private Integer rank;/*** 全班排名*/private List<StudentScoreDto> rankList;}
StudentAssemble.java
public class StudentAssemble {/*** 查询学生成绩列表** @param student 学生实体对象* @return 学生成绩集合*/public static List<StudentScore> queryList(Student student) {// 模拟查询学生信息List<StudentScore> studentScores = Arrays.asList(new StudentScore("张三", "语文", 81),new StudentScore("张三", "数学", 88),new StudentScore("张三", "英语", 90),new StudentScore("李四", "语文", 72),new StudentScore("李四", "数学", 97),new StudentScore("李四", "英语", 77),new StudentScore("王五", "语文", 95),new StudentScore("王五", "数学", 62),new StudentScore("王五", "英语", 92));if (Objects.isNull(student) || StringUtils.isEmpty(student.getName())) {return studentScores;}String name = student.getName();return studentScores.stream().filter(e -> name.equals(e.getName())).collect(Collectors.toList());}/*** 计算总分以及排名** @param studentScoreList 学生成绩集合* @param studentScoreDto 学生成绩DTO*/public static void calcSort(List<StudentScore> studentScoreList, StudentScoreDto studentScoreDto) {if (studentScoreList == null || studentScoreList.size() == 0) {return;}List<StudentScoreDto> tempList = new ArrayList<>();Map<String, List<StudentScore>> studentScoreMap = studentScoreList.stream().collect(Collectors.groupingBy(StudentScore::getName));for (List<StudentScore> value : studentScoreMap.values()) {if (value == null || value.size() == 0) continue;StudentScore studentScore = value.get(0);// 汇总学生总成绩,如果成绩不存在,则直接给0Integer sumScore = value.stream().map(StudentScore::getScore).reduce(Integer::sum).orElse(0);StudentScoreDto resultDto = new StudentScoreDto();resultDto.setName(studentScore.getName());resultDto.setScore(sumScore);tempList.add(resultDto);}AtomicInteger counter = new AtomicInteger(1);// 处理排名List<StudentScoreDto> resultList = tempList.stream().sorted(Comparator.comparing(StudentScoreDto::getScore).reversed()).collect(Collectors.toList());resultList.forEach(e -> e.setRank(counter.getAndIncrement()));studentScoreDto.setRankList(resultList);}/*** 查询学生成绩** @param studentScoreList 学生成绩集合* @param studentScoreDto 学生成绩DTO*/public static void findFirst(List<StudentScore> studentScoreList, StudentScoreDto studentScoreDto) {if (studentScoreList == null || studentScoreList.size() == 0) {return;}List<StudentScoreDto> rankList = studentScoreDto.getRankList();if (StringUtils.isEmpty(studentScoreDto.getName())) {// 学生名称为空,则输出第一名Optional<StudentScoreDto> first = rankList.stream().min(Comparator.comparing(StudentScoreDto::getRank));if (first.isPresent()) {StudentScoreDto studentScoreDto1 = first.get();System.out.println("第一名是:" + studentScoreDto1.getName() + ", 总分:" + studentScoreDto1.getScore());}return;}// 学生名称不为空,则输出学生排名Optional<StudentScoreDto> first = rankList.stream().filter(e -> studentScoreDto.getName().equals(e.getName())).findFirst();if (first.isPresent()) {StudentScoreDto studentScoreDto1 = first.get();System.out.println(studentScoreDto1.getName() + " 排名:" + studentScoreDto1.getRank() + ", 总分:" + studentScoreDto1.getScore());}}
感 谢 各 位 大 佬 的 阅 读,随 手 点 赞,日 薪 过 万~! !!
相关文章:
Java8 BiConsumer<T, U> 函数接口浅析分享(含示例,来戳!)
文章目录 Java8 BiConsumer<T, U> 函数接口浅析分享(含示例,来戳!)源码accept 方法示例示例一示例二 andThen 方法示例示例一示例二 示例相关代码类dohandler 方法student.javaStudentScore.javaStudentScoreDto.java Java8…...
C++学习:类的使用--运算符重载
我们知道C可以对函数进行重载,让同名的函数来完成相同的基本操作。其实运算符也是可以重载的,而且有的运算符已经在使用了,就像*,既可以用于地址,又可以用于乘法。 下面是一个计算时间的类 #ifndef MYTIME_H #define…...
嵌入式养成计划-46----QT--简易版网络聊天室实现--QT如何连接数据库
一百一十九、简易版网络聊天室实现 119.1 QT实现连接TCP协议 119.1.1 基于TCP的通信流程 119.1.2 QT中实现服务器过程 使用QTcpServer实例化一个服务器对象设置监听状态,通过listen()函数,可以监听特定的主机,也可以监听所有客户端&#x…...
YOLO目标检测——人脸识别数据集【对应voc、coco和yolo三种格式标签】
实际项目应用:安全监控、智能驾驶、人机交互、人脸门禁、人脸支付、人脸搜索数据集说明:人脸识别数据集,真实场景的高质量图片数据,数据场景丰富,含有人脸图片标签说明:使用lableimg标注软件标注࿰…...
mybatis日志不打印的问题
在项目中使用了 spring boot,orm 层集成了 mybatis-plus,按照默认配置后发现之前配置的 sql 日志正常,在这里却不正常,鉴于日志使用的是 logback,想到了打印 sql 的日志级别是 debug,所以,按照这…...
【分布式缓存】关于 Memcached 的几个常见问题
关于 Memcached 的几个常见问题 1.Memcached 是怎么工作的?2.Memcached 最大的优势是什么?3.Memcached 和 MySQL 的 querycache 相比,有什么优缺点?4.Memcached 和服务器的 local cache(比如 PHP 的 APC、mmap 文件等&…...
MySQL 三大日志(bin log、redo log、undo log)
redo log redo log (重做日志) 是 InnoDB 存储引擎独有的,它让 MySQL有了崩溃恢复的能力,是事务中实现 持久化的重要操作 比如 MySQL 实例宕机了,重启时,InnoDB 存储引擎会使用 redo log 恢复数据,保证数据的持久性与…...
asp.net社区医疗辅助诊断网站系统VS开发sqlserver数据库web结构c#编程
一、源码特点 asp.net社区医疗辅助诊断网站系统 是一套完善的web设计管理系统,系统采用mvc模式(BLLDALENTITY)系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为vs2010,数据库为sqlserver200…...
NLP Bi-Encoder和Re-ranker
Retrieve & Re-Rank https://www.sbert.net/examples/applications/retrieve_rerank/README.html Bi-Encoder vs. Cross-Encoder https://www.sbert.net/examples/applications/cross-encoder/README.html Bi-Encoder会用BERT对输入文本编码,再根据cosine相似度…...
SpringBoot+Mybatis 配置多数据源及事务管理
目录 1.多数据源 2.事务配置 项目搭建参考: 从零开始搭建SpringBoot项目_从0搭建springboot项目-CSDN博客 SpringBoot学习笔记(二) 整合redismybatisDubbo-CSDN博客 1.多数据源 添加依赖 <dependencies><dependency><groupId>org.springframework.boot&…...
华为OD 猴子吃桃(100分)【java】A卷+B卷
华为OD统一考试A卷+B卷 新题库说明 你收到的链接上面会标注A卷还是B卷。目前大部分收到的都是B卷。 B卷对应20022部分考题以及新出的题目,A卷对应的是新出的题目。 我将持续更新最新题目 获取更多免费题目可前往夸克网盘下载,请点击以下链接进入: 我用夸克网盘分享了「华为O…...
切片不够技术来凑
概述 随着数据经度的提升,18级的切片有些场景已经不够用了,但是大部分在线的栅格切片最大级别还是18级,如果地图继续放大,有的框架(leaflet会,openlayers和mapboxGL不会)会存在没有底图的情况。…...
特约|数码转型思考:Web3.0与银行
日前,欧科云链研究院发布重磅报告,引发银行界及金融监管机构广泛关注。通过拆解全球70余家银行的加密布局,报告认为,随着全球采用率的提升与相关技术的成熟,加密资产已成为银行业不容忽视也不能错过的创新领域。 作为…...
MySQL知识详细汇总
存储引擎 MyISAM 不支持事务,不支持外键,支持全文索引,查询、插入效率高InnoDB 支持事务(事务的特性) 原子性:一个事务中所有的操作,要么全部完成,要么全部不完成,不会在…...
【驱动开发】LED灯的亮灭——通过字符设备驱动的分步实现编写LED驱动,实现设备文件和设备的绑定
头文件: #ifndef __HEAD_H__ #define __HEAD_H__typedef struct {unsigned int MODER;unsigned int OTYPER;unsigned int OSPEEDR;unsigned int PUPDR;unsigned int IDR;unsigned int ODR; }gpio_t;//LED灯的寄存器地址 #define LED1_ADDR 0X50006000 #define L…...
华为OD 最小数字(100分)【java】A卷+B卷
华为OD统一考试A卷+B卷 新题库说明 你收到的链接上面会标注A卷还是B卷。目前大部分收到的都是B卷。 B卷对应20022部分考题以及新出的题目,A卷对应的是新出的题目。 我将持续更新最新题目 获取更多免费题目可前往夸克网盘下载,请点击以下链接进入: 我用夸克网盘分享了「华为O…...
大模型、实时需求推动湖仓平台走向开放
大模型、实时需求高涨 AGI 时代,以 ChatGPT、Midjourney 等为代表的大模型迅速应用加速了 AI 普及,越来越多的企业选择搭建自己的 AI 基础设施,训练行业大模型。 另一方面,企业为了在瞬息万变的市场环境中更快的做出商业决策&…...
Linux搭建文件服务器
搭建简单文件服务器 基于centos7.9搭建http文件服务器基于centos7.9搭建nginx文件服务器基于ubuntu2204搭建http文件服务器 IP环境192.168.200.100VMware17 基于centos7.9搭建http文件服务器 安装httpd [rootlocalhost ~]# yum install -y httpd关闭防火墙以及selinux [roo…...
跨境商城源码可以支持多种支付方式吗?
跨境商城源码是一种用于建立跨国界电商平台的程序代码。随着全球电商的繁荣发展,越来越多的商家开始寻找一种既安全可靠,又能满足用户需求的支付方式。那么,跨境商城源码是否能够支持多种支付方式呢?让我们深入探讨一下。 1. 支付宝支付 支付…...
机器学习中的核方法
一、说明 线性模型很棒,因为它们易于理解且易于优化。他们受苦是因为他们只能学习非常简单的决策边界。神经网络可以学习更复杂的决策边界,但失去了线性模型良好的凸性特性。 使线性模型表现出非线性的一种方法是转换输入。例如,通过添加特征…...
算法可视化神器!用动画让冒泡排序、二分查找一目了然
还在为理解冒泡排序的每一趟交换,或是二分查找的边界条件而绞尽脑汁吗?静态的代码和文字描述有时确实不够直观。 想要真正让算法“动”起来,一目了然?强烈推荐你试试**图码这个专注于算法可视化**的神器。 它提供了超过60种数据…...
AI Agent Harness Engineering 开发必备技能栈:编程语言、框架与工具全梳理
AI Agent Harness Engineering 开发必备技能栈:编程语言、框架与工具全梳理 一、引言 (Introduction) 钩子 (The Hook) 你是否见过凌晨三点的硅谷车库咖啡馆?哦,现在的硅谷极客早就不再只盯着屏幕上单调的GAN生成图或微调Transformer的loss曲线了——最近,一杯Espresso旁…...
Alibi分布式计算指南:如何用Ray加速大规模模型解释
Alibi分布式计算指南:如何用Ray加速大规模模型解释 【免费下载链接】alibi Algorithms for explaining machine learning models 项目地址: https://gitcode.com/gh_mirrors/al/alibi 在处理大规模机器学习模型解释时,单机计算往往面临性能瓶颈。…...
小红的图上加边【牛客tracker 每日一题】
小红的图上加边 时间限制:1秒 空间限制:256M 网页链接 牛客tracker 牛客tracker & 每日一题,完成每日打卡,即可获得牛币。获得相应数量的牛币,能在【牛币兑换中心】,换取相应奖品!助力每…...
SAP ABAP长文本读取性能瓶颈诊断与批量优化实战:从READ_TEXT到READ_TEXT_TABLE
1. 当SAP报表遇上长文本:性能噩梦的开始 相信每个ABAP开发者都遇到过这样的场景:一个原本运行良好的物料报表,突然因为增加了长文本显示需求而变得奇慢无比。我去年就接手过这样一个项目,用户抱怨说点击报表后可以去泡杯咖啡&…...
点云深度学习系列博客(六): 从注意力到三维感知——Point Transformer的架构演进与实战解析
1. 从NLP到三维视觉:注意力机制的跨界之旅 第一次看到Transformer在点云上跑通实验结果时,我正对着屏幕上的3D分割结果发呆——那些精确到毫米级的物体边界,完全颠覆了我对传统点云处理方法的认知。这要归功于注意力机制的神奇迁移能力&#…...
MyBatis-Plus lambdaQuery条件构造器:EQ、NE、GT等操作符实战解析
1. 为什么需要lambdaQuery条件构造器 如果你用过MyBatis,肯定遇到过这样的场景:为了查询某个状态的数据,不得不写一堆if判断来拼接SQL。比如查询用户列表,要根据不同条件筛选,代码里全是"if(name!null){sql"…...
手把手教你优化SZY206-2016水资源通讯协议(附完整代码示例)
深度优化SZY206-2016水资源通讯协议的工程实践 在物联网水文监测领域,SZY206-2016协议作为行业标准通讯规范,承载着水资源数据采集与传输的核心任务。然而在实际工程落地过程中,开发者们常常面临协议细节模糊、功能缺失、数据转换复杂等痛点。…...
AXI基础知识学习
1、AXI通道主从之间5个通信通道:写操作使用如下通道:(1)主——>从,主使用AW通道发送写地址,主使用W通道发送数据;(2)从——>主,写操作完成之后…...
内网环境下的Conan服务器搭建:基于Artifactory的完整配置指南
内网环境下的Conan服务器搭建:基于Artifactory的完整配置指南 在企业级C/C开发中,依赖管理一直是困扰开发团队的痛点。当项目规模扩大、团队协作需求增加时,如何高效管理第三方库和内部组件成为关键挑战。特别是在金融、军工等对网络安全要求…...
