Java 中的 Consumer:让操作与输出更简洁灵活

文章目录

        • 1. Consumer 基础:单一操作的便捷实现
        • 2. forEach 与 Consumer:循环中的简化操作
        • 3. 链式 Consumer:andThen 实现多个操作
        • 4. 配合 Map 使用:多用途数据处理
        • 5. 定义通用 Consumer:增强代码复用
        • 6. Consumer 配合 Optional:优雅的异常处理
        • 7. 自定义 Consumer:抽象业务逻辑
        • 8. 组合其他函数式接口:形成复杂业务逻辑
        • 总结:
        • 推荐阅读文章

Java 8 引入的 Consumer<T> 接口是函数式接口家族的一员。它用于对传入的对象执行某种操作而不返回任何值,适用于各种不产生返回结果的场景,比如打印、存储、日志记录等。今天,我们来探索一下 Consumer 在 Java 中的巧妙应用!

1. Consumer 基础:单一操作的便捷实现

Consumer<T> 接收一个参数,不返回任何值。它的典型用法是定义一个具体操作,比如打印:

Consumer<String> print = System.out::println;
print.accept("Hello, Java Consumer!");

accept 方法执行 Consumer 定义的操作。这里通过 System.out::println 传递一个方法引用,使打印操作更简洁。

2. forEach 与 Consumer:循环中的简化操作

Consumer 的实际应用之一是简化集合遍历。许多场景下,我们使用循环处理集合中的每个元素,而 forEachConsumer 的结合可以让代码更简洁:

List<String> names = List.of("Alice", "Bob", "Charlie");
names.forEach(name -> System.out.println("Hello, " + name + "!"));

这样既减少了代码量,也让操作逻辑更加直观,尤其是对于只需要执行单一操作的循环。

3. 链式 Consumer:andThen 实现多个操作

Consumer 的妙用之一是支持链式操作,可以使用 andThen() 方法组合多个操作。在处理数据时,往往需要先处理、再输出或者做多个后续处理,比如:

Consumer<String> print = System.out::println;
Consumer<String> toUpperCasePrint = s -> System.out.println(s.toUpperCase());print.andThen(toUpperCasePrint).accept("hello");

这样一行代码就实现了同时打印原始字符串和大写字符串的效果,轻松应对多操作需求。

4. 配合 Map 使用:多用途数据处理

在处理 Map 类型的数据时,Consumer 也是很好的助手。比如我们想要打印键值对,可以使用 forEachBiConsumer 搭配:

Map<String, Integer> scores = Map.of("Alice", 90, "Bob", 80, "Charlie", 85);
scores.forEach((name, score) -> System.out.println(name + ": " + score));

这是遍历 Map 的一种更简洁、更优雅的方式。可以根据需求,轻松实现不同格式的输出。

5. 定义通用 Consumer:增强代码复用

Consumer 可以作为通用处理逻辑的一部分,封装在方法中。比如创建一个通用的日志记录方法:

public static <T> void processAndLog(T item, Consumer<T> action) {System.out.println("Processing: " + item);action.accept(item);System.out.println("Processed: " + item);
}

在使用时,只需传入具体的 Consumer 操作,例如处理订单时:

Order order = new Order(123);
processAndLog(order, o -> System.out.println("Order ID: " + o.getId()));

这种做法不仅简化了业务逻辑,还提升了代码的复用性和扩展性。

6. Consumer 配合 Optional:优雅的异常处理

OptionalifPresent 方法也支持传入一个 Consumer,当值存在时执行操作。这样可以避免传统的 null 检查:

Optional<String> optional = Optional.of("Hello, Optional!");
optional.ifPresent(value -> System.out.println("Value: " + value));

通过 ConsumerOptional 的结合,异常处理更优雅,不必手动检查 null,代码可读性也更高。

7. 自定义 Consumer:抽象业务逻辑

Consumer 可以用来封装业务逻辑,定义一套抽象的操作。比如在购物系统中,我们可以定义不同的促销活动,给 Consumer 注入不同的逻辑:

public static void applyDiscount(Product product, Consumer<Product> discountStrategy) {discountStrategy.accept(product);System.out.println("Applied discount to " + product.getName());
}Consumer<Product> seasonalDiscount = p -> p.setPrice(p.getPrice() * 0.9);
applyDiscount(product, seasonalDiscount);

通过这种方式,可以灵活地改变折扣逻辑,而不需要对方法进行修改。

8. 组合其他函数式接口:形成复杂业务逻辑

Consumer 可以与其他函数式接口组合,实现更复杂的业务逻辑。例如,PredicateConsumer 的组合可以实现条件化操作:

Predicate<Product> isExpensive = p -> p.getPrice() > 100;
Consumer<Product> notifyCustomer = p -> System.out.println("Notify: " + p.getName() + " is on sale!");products.stream().filter(isExpensive).forEach(notifyCustomer);

这样,我们实现了只对价格大于 100 的商品进行通知,结构清晰又便于扩展。

总结:

Java 中的 Consumer 虽然只做“无返回值”操作,但其灵活性让它能巧妙地应用于各种场景中。无论是组合操作、条件处理、数据转换,还是集合遍历,Consumer 都能帮助我们写出更简洁、灵活、易读的代码。希望以上技巧能激发你在代码中更多妙用 Consumer 的灵感!

推荐阅读文章
  • 由 Spring 静态注入引发的一个线上T0级别事故(真的以后得避坑)
  • 如何理解 HTTP 是无状态的,以及它与 Cookie 和 Session 之间的联系
  • HTTP、HTTPS、Cookie 和 Session 之间的关系
  • 什么是 Cookie?简单介绍与使用方法
  • 什么是 Session?如何应用?
  • 使用 Spring 框架构建 MVC 应用程序:初学者教程
  • 有缺陷的 Java 代码:Java 开发人员最常犯的 10 大错误
  • 如何理解应用 Java 多线程与并发编程?
  • 把握Java泛型的艺术:协变、逆变与不可变性一网打尽
  • Java Spring 中常用的 @PostConstruct 注解使用总结
  • 如何理解线程安全这个概念?
  • 理解 Java 桥接方法
  • Spring 整合嵌入式 Tomcat 容器
  • Tomcat 如何加载 SpringMVC 组件
  • “在什么情况下类需要实现 Serializable,什么情况下又不需要(一)?”
  • “避免序列化灾难:掌握实现 Serializable 的真相!(二)”
  • 如何自定义一个自己的 Spring Boot Starter 组件(从入门到实践)
  • 解密 Redis:如何通过 IO 多路复用征服高并发挑战!
  • 线程 vs 虚拟线程:深入理解及区别
  • 深度解读 JDK 8、JDK 11、JDK 17 和 JDK 21 的区别
  • 10大程序员提升代码优雅度的必杀技,瞬间让你成为团队宠儿!
  • “打破重复代码的魔咒:使用 Function 接口在 Java 8 中实现优雅重构!”
  • Java 中消除 If-else 技巧总结
  • 线程池的核心参数配置(仅供参考)
  • 【人工智能】聊聊Transformer,深度学习的一股清流(13)
  • Java 枚举的几个常用技巧,你可以试着用用

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

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

相关文章

VMware Fusion和centos 8的安装

资源 本文用到的文件&#xff1a;centos8镜像 , VMware 软件包 , Termius 文件链接: https://pan.baidu.com/s/1kOES_ZJ8NGN-BnJl6NC7Sg?pwd63ct 安装虚拟机 先 安装 vmware &#xff0c;然后打开&#xff0c;将下载的 iso 镜像拖入 拖入镜像文件iso Continue, 然后随便选…

【嵌入式开发——ARM】1ARM架构

嵌入式领域&#xff0c;使用ARM架构的芯片公司可不占少数吧&#xff0c;intel的x86架构主要占据PC、服务器市场&#xff0c;ARM架构主要占据移动市场。x86架构和ARM架构不同的主要原因&#xff0c;是背后使用的计算机指令集不同。计算机有自己的语言系统&#xff08;汇编&#…

LabVIEW扫描探针显微镜系统

开发了一套基于LabVIEW软件开发的扫描探针显微镜系统。该系统专为微观尺度材料的热性能测量而设计&#xff0c;特别适用于纳米材料如石墨烯、碳纳米管等的研究。系统通过LabVIEW编程实现高精度的表面形貌和热性能测量&#xff0c;广泛应用于科研和工业领域。 项目背景 随着纳…

JavaScript day01 笔记

一、引入方式 JavaScript 程序不能独立运行&#xff0c;它需要被嵌入 HTML 中&#xff0c;然后浏览器才能执行 JavaScript 代码。通过 script 标签将 JavaScript 代码引入到 HTML 中 1️⃣内部 通过 script 标签包裹 JavaScript 代码&#xff08;一般就写在</script>的…

【Git】Liunx环境下Git的使用:“克隆,提交,推送“

目录 一、常用参数 二、我们为什么要使用Git&#xff1f; 三、创建远程仓库 第一步&#xff1a;创建对应代码托管平台账号。 第二步&#xff1a;在托管平台创建仓库 第三步&#xff1a;完善仓库内容&#xff08;选择性使用&#xff09; 开源和私有 四、克隆远程仓库到本…

机器人零位、工作空间、坐标系及其变换,以UR5e机器人为例

机器人中的主要坐标系 在机器人中&#xff0c;常用的坐标系包括&#xff1a; 基坐标系&#xff08;Base Frame&#xff09;&#xff1a;固定在机器人基座上的坐标系&#xff0c;用于描述机器人的整体位置和方向&#xff0c;是其他所有坐标系的参考点。 连杆坐标系&#xff08…

JavaSE:运算符 (学习笔记)

目录 一&#xff0c;算术运算符 【1】 共同点&#xff1a; 【2】 不同点&#xff1a; 二&#xff0c;关系运算符 三&#xff0c;逻辑运算符 2&#xff0c;&和&&的区别和联系 { |和||的区别和联系 }---两题类似 四&#xff0c;赋值运算符 五&#xff0c;拓展…

C++中类的默认成员函数

默认成员函数 1.构造函数2.析构函数3.拷贝构造函数4.赋值运算符重载4.1运算符重载4.2赋值运算符重载 #mermaid-svg-oipiwg9stvONvYK0 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-oipiwg9stvONvYK0 .error-icon{f…

游戏引擎学习第一天

视频参考: https://www.bilibili.com/video/BV1zGDCYHErA/ 创建一个保存项目的路径 VS的安装略过&#xff0c;个人自行百度 1. vs 创建第一个CMAKE的窗口项目 game.cpp 修改如下的代码 到https://learn.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-winmain 去…

视频播放相关的杂记

基于QT FFMPEG设计一款 RTMP协议推流、视频录制软件 实现的功能&#xff1a; &#xff08;1&#xff09;将摄像头视频流 麦克风音频流合并&#xff0c;并推到流媒体服务器 &#xff08;2&#xff09;将摄像头视频流 麦克风音频流保存到本地磁盘 基于QtFFMPEG设计一款RTM…

2024年将尽,我们开始为ESG的未来感到担忧 | 深度

2024已经接近尾声了&#xff0c;今年ESG的发展状况非常两级分化。最极端者&#xff0c;有人觉得ESG要在2024年起飞的&#xff0c;毕竟今年三大交易所出台了《上市公司可持续发展报告指引》&#xff0c;“A股公司进入ESG信披新纪元”。而在另一个极端&#xff0c;有人认为ESG“将…

windows中docker安装redis和redisinsight记录

创建一个Redis运行容器&#xff0c;命令如下 docker run -it -d --name redis -p 6379:6379 redis --bind 0.0.0.0 --protected-mode no -d 代表Redis容器后台运行 --name redis 给创建好的容器起名叫redis -p 6379:6379 将容器的6379端口映射到宿主机的6379端口&#xff0c;注…

atcoder解题

#include <iostream> #include <vector>using namespace std;int main() {long long N, M;cin >> N >> M;vector<long long> X(M), A(M);long long totalStones 0;// 读入 X 和 Afor (int i 0; i < M; i) {cin >> X[i];}for (int i …

Vue:侦听属性

Vue&#xff1a;侦听属性 watch深度侦听异步任务 watch 在Vue中&#xff0c;允许用户在数据改变时&#xff0c;做出一定的处理。 语法&#xff1a; new Vue({watch:{属性名:{handler(newValue, oldValue){// 函数体} }} })当一个属性被写入watch中&#xff0c;每当这个属性…

《计算机原理与系统结构》学习系列——存储器(上)

系列文章目录 目录 存储器技术概要存储器层次cache&#xff0c;内存辅存存储器技术SRAM技术DRAM技术闪存磁盘存储器 局部性原理 高速缓存cache访存性能概念命中与缺失访存阻塞的周期数 cache基础&#xff1a;直接映射块号内存地址字段缺失缺失处理和写策略 全相联映射组相连映…

github高分项目 WGCLOUD - 运维实时管理工具

GitHub - tianshiyeben/wgcloud: Linux运维监控工具&#xff0c;支持系统硬件信息&#xff0c;内存&#xff0c;CPU&#xff0c;温度&#xff0c;磁盘空间及IO&#xff0c;硬盘smart&#xff0c;GPU&#xff0c;防火墙&#xff0c;网络流量速率等监控&#xff0c;服务接口监测&…

A021基于Spring Boot的自习室管理和预约系统设计与实现

&#x1f64a;作者简介&#xff1a;在校研究生&#xff0c;拥有计算机专业的研究生开发团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339; 赠送计算机毕业设计600…

【EasyExcel】EasyExcel导出表格包含合计行、自定义样式、自适应列宽

目录 0 EasyExcel简介1 Excel导出工具类设置自定义表头样式设置自适应列宽添加合计行 2 调用导出工具类导出Excel表3 测试结果 0 EasyExcel简介 在数据处理和报表生成的过程中&#xff0c;Excel是一个非常常用的工具。特别是在Java开发中&#xff0c;EasyExcel库因其简单高效而…

2024年11月09号Drawing Memory Models Review 2

So lets start with a piece of code that well be thinking about and take a few seconds to read it carefully and try to explain, in your own words, what this piece of code does.

【HarmonyOS】鸿蒙应用低功耗蓝牙BLE的使用心得 (二)

【HarmonyOS】鸿蒙应用低功耗蓝牙BLE的使用心得 &#xff08;二&#xff09; 一、前言 目前鸿蒙应用的实现逻辑&#xff0c;基本都是参考和移植Android端来实现。针对BLE低功耗蓝牙来说&#xff0c;在鸿蒙化的实现过程中。我们发现了&#xff0c;鸿蒙独有的优秀点&#xff0c…