Lambda 函数与 peek 操作的使用案例

Lambda 函数和 peek 操作是 Java 8 Stream API 中非常有用的特性,下面我将介绍它们的使用案例。

Lambda 函数使用案例
Lambda 表达式是 Java 8 引入的一种简洁的匿名函数表示方式。
集合操作

List<String> names = Arrays.asList("Alice", "Bob", "Charlie");// 使用 Lambda 表达式排序
Collections.sort(names, (a, b) -> a.compareTo(b));// 使用 Lambda 表达式遍历
names.forEach(name -> System.out.println(name));// 使用方法引用
names.forEach(System.out::println);

过滤和映射

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);// 过滤偶数
List<Integer> evenNumbers = numbers.stream().filter(n -> n % 2 == 0).collect(Collectors.toList());// 平方映射
List<Integer> squares = numbers.stream().map(n -> n * n).collect(Collectors.toList());

peek 操作使用案例
peek() 是 Stream API 中的一个中间操作,主要用于调试或观察流中的元素而不改变它们。

List<String> result = Stream.of("one", "two", "three", "four").filter(e -> e.length() > 3).peek(e -> System.out.println("Filtered value: " + e)).map(String::toUpperCase).peek(e -> System.out.println("Mapped value: " + e)).collect(Collectors.toList());

调试流操作
List numbers = Arrays.asList(1, 2, 3, 4, 5);

List result = numbers.stream()
.peek(x -> System.out.println("原始: " + x))
.map(x -> x * 2)
.peek(x -> System.out.println("乘2后: " + x))
.filter(x -> x > 5)
.peek(x -> System.out.println("过滤后: " + x))
.collect(Collectors.toList());
修改对象状态

List<User> users = getUsers();List<User> updatedUsers = users.stream().peek(user -> {if (user.getAge() > 30) {user.setGroup("Senior");}}).collect(Collectors.toList());

结合使用 Lambda 和 peek 的实用案例
案例1:日志调试

List<String> transactions = getTransactions();List<String> validTransactions = transactions.stream().filter(t -> t.startsWith("TX"))  // Lambda 过滤.peek(t -> System.out.println("有效交易ID: " + t))  // 调试日志.map(t -> t.toUpperCase())  // Lambda 转换.collect(Collectors.toList());

案例2:性能监控

List<Data> bigData = getData();long start = System.currentTimeMillis();List<Data> processed = bigData.stream().peek(d -> {if (System.currentTimeMillis() - start > 1000) {System.out.println("处理超时警告");}}).map(d -> processData(d))  // 假设processData是一个处理方法.collect(Collectors.toList());

案例3:多步骤处理

List<Product> products = getProducts();List<Product> discountedProducts = products.stream().peek(p -> System.out.println("原始价格: " + p.getPrice())).filter(p -> p.getPrice() > 100)  // 只处理高价商品.peek(p -> p.setPrice(p.getPrice() * 0.9))  // 打9折.peek(p -> System.out.println("折扣后价格: " + p.getPrice())).collect(Collectors.toList());

注意事项
peek() 是一个中间操作,如果没有终止操作,它不会执行
不要滥用 peek() 来修改状态,这可能导致不可预期的行为
生产环境中应谨慎使用 peek() 进行日志记录,可能影响性能
Lambda 表达式应保持简洁,复杂逻辑应考虑使用方法引用或单独的方法
Lambda 和 peek 的组合为 Java 流式编程提供了强大的调试和观察能力,同时保持了代码的简洁性。

Java Stream API 常用操作详解
下面我将详细介绍 Java Stream API 中的 peek, filter, map, limit, skip, collect 和 distinct 等常用操作,并提供使用示例。

  1. peek() - 流元素操作(调试用)
    peek() 是一个中间操作,用于观察流中的元素而不改变它们,主要用于调试。
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");
List<String> result = names.stream().peek(name -> System.out.println("原始名字: " + name)).map(String::toUpperCase).peek(name -> System.out.println("转换后: " + name)).collect(Collectors.toList());
  1. filter() - 过滤
    filter() 根据条件过滤流中的元素。
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);// 过滤偶数
List<Integer> evenNumbers = numbers.stream().filter(n -> n % 2 == 0).collect(Collectors.toList());// 过滤长度大于3的字符串
List<String> longNames = names.stream().filter(name -> name.length() > 3).collect(Collectors.toList());
  1. map() - 映射
    map() 将流中的每个元素转换为另一个形式。
// 将字符串转换为大写
List<String> upperCaseNames = names.stream().map(String::toUpperCase).collect(Collectors.toList());// 提取对象属性
List<Integer> nameLengths = names.stream().map(String::length).collect(Collectors.toList());// 复杂映射
List<Employee> employees = getEmployees();
List<String> employeeNames = employees.stream().map(Employee::getName).collect(Collectors.toList());
  1. limit() - 截断
    limit() 限制流中元素的数量。
// 只取前3个元素
List<Integer> firstThree = numbers.stream().limit(3).collect(Collectors.toList());// 结合其他操作
List<String> result = names.stream().filter(name -> name.length() > 3).limit(2).collect(Collectors.toList());
  1. skip() - 跳过
    skip() 跳过流中的前N个元素。
// 跳过前2个元素
List<Integer> skipped = numbers.stream().skip(2).collect(Collectors.toList());// 分页实现
int pageSize = 5;
int pageNumber = 2; // 第2页
List<String> page = names.stream().skip((pageNumber - 1) * pageSize).limit(pageSize).collect(Collectors.toList());
  1. collect() - 收集
    collect() 是一个终止操作,将流转换为集合或其他形式。
// 转换为List
List<String> list = names.stream().collect(Collectors.toList());// 转换为Set
Set<String> set = names.stream().collect(Collectors.toSet());// 转换为Map
Map<String, Integer> nameLengthMap = names.stream().collect(Collectors.toMap(name -> name,         // 键String::length         // 值));// 连接字符串
String joined = names.stream().collect(Collectors.joining(", "));// 分组
Map<Integer, List<String>> groupByLength = names.stream().collect(Collectors.groupingBy(String::length));
  1. distinct() - 去重
    distinct() 去除流中的重复元素。
List<Integer> numbersWithDuplicates = Arrays.asList(1, 2, 2, 3, 4, 4, 5);// 基本去重
List<Integer> distinctNumbers = numbersWithDuplicates.stream().distinct().collect(Collectors.toList());// 对象去重(需要正确实现equals和hashCode)
List<Employee> distinctEmployees = employees.stream().distinct().collect(Collectors.toList());// 结合其他操作
List<String> distinctLongNames = names.stream().filter(name -> name.length() > 3).distinct().collect(Collectors.toList());

综合使用示例

List<Transaction> transactions = getTransactions();
// 复杂流处理
Map<String, Double> result = transactions.stream().peek(t -> System.out.println("处理交易: " + t.getId()))  // 调试.filter(t -> t.getAmount() > 1000)                     // 过滤小额交易.distinct()                                            // 去重.skip(5)                                               // 跳过前5条.limit(10)                                             // 只取10条.collect(Collectors.groupingBy(Transaction::getCurrency,                          // 按货币分组Collectors.summingDouble(Transaction::getAmount)   // 计算每种货币的总金额));

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

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

相关文章

Docker私有仓库页面访问实现

通过 docker run -d -p 5000:5000 --name registry registry:2 命令搭建的Docker私有仓库默认不提供网页访问界面。它是一个基于API的后端服务&#xff0c;主要用于镜像的存储和管理。但可以通过以下两种方式实现网页访问&#xff1a; 一、通过第三方Web UI工具扩展 1. 使用 D…

[王阳明代数讲义]语言模型核心代码调研

语言模型核心代码调研 基于Consciciteation‌的才气张量持续思考综述将文本生成建模为才气张量网络扩散过程&#xff0c;实现非自回归推理通过才气张量的群-拓扑流形交叉注意力实现多模态推理&#xff0c;将输入压缩到低维空间持续迭代提出「条件计算提前终止」机制&#xff0c…

flink jobmanager离奇的heap oom

文章目录 现象描述开始分析1.初步分析dump文件2.AI分析引用关系分析方向2.1 flink BlobServer bug分析方向2.2 和运行环境有关分析方向2.3 和任务有关 回到问题本身&#xff0c;思考一下1. seatunnel到底有没有问题2.再次分析zipfile对象3.分析seatunnel es connector 源码4 怀…

APP动态交互原型实例|墨刀变量控制+条件判断教程

引言 不同行业的产品经理在绘制原型图时&#xff0c;拥有不同的呈现方式。对于第三方软件技术服务公司的产品经理来说&#xff0c;高保真动态交互原型不仅可以在开发前验证交互逻辑&#xff0c;还能为甲方客户带来更直观、真实的体验。 本文第三部分将分享一个实战案例&#…

AI 驱动下的后端开发架构革命:从智能协同体系

AI 驱动下的后端开发架构革命&#xff1a;从智能协同体系 一、引言&#xff1a;AI 重构后端开发范式 在 2025 年的企业级技术演进中&#xff0c;人工智能正从辅助工具升级为核心架构要素。根据 Gartner《2025 智能技术栈成熟度报告》&#xff0c;传统 "人力编码 硬规则…

安卓基础(生命周期)

创建阶段&#xff1a;onCreate方法被调用&#xff0c;用于初始化 Activity&#xff0c;如设置布局等。启动阶段&#xff1a;依次调用onStart和onResume方法&#xff0c;让 Activity 变得可见并可与用户交互。暂停与恢复阶段&#xff1a;当 Activity 失去焦点但可见时&#xff0…

Uniapp: 下拉选择框 ba-tree-picker

目录 1、效果展示2、如何使用2.1 插件市场2.2 引入插件 3、参数配置3.1 属性3.2 方法 4、遇见的问题4.1、设置下拉树的样式 1、效果展示 2、如何使用 2.1 插件市场 首先从插件市场中将插件导入到项目中 2.2 引入插件 在使用的页面引入插件 <view click"showPicke…

Spring Boot实战:基于策略模式+代理模式手写幂等性注解组件

一、为什么需要幂等性&#xff1f; 核心定义&#xff1a;在分布式系统中&#xff0c;一个操作无论执行一次还是多次&#xff0c;最终结果都保持一致。 典型场景&#xff1a; 用户重复点击提交按钮网络抖动导致的请求重试消息队列的重复消费支付系统的回调通知 不处理幂等的风…

如何恢复极狐GitLab?

极狐GitLab 是 GitLab 在中国的发行版&#xff0c;关于中文参考文档和资料有&#xff1a; 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 恢复极狐GitLab (BASIC SELF) 极狐GitLab 提供了一个命令行界面来恢复整个安装&#xff0c;足够灵活以满足您的需求。 恢复…

面试高阶问题:android后台任务(如数据同步、定位)消耗过多电量,导致用户投诉。你会如何分析和优化后台任务的执行?

在现代移动设备生态中,安卓系统以其开放性和灵活性占据了全球智能手机市场的绝大部分份额。作为一款功能强大的操作系统,安卓允许应用程序在后台执行各种任务,例如数据同步、定位服务、消息推送以及其他周期性更新。这些后台任务在提升用户体验方面扮演了不可或缺的角色——…

最近在学习web搞大屏看板

人到中年&#xff0c;delphi发展越来越不行&#xff0c;就业环境是真差啊&#xff0c;没办法&#xff0c;学呗 中国地图&#xff1a; // 中国地图function getChinaMapChart() {// 初始化echarts实例var myEcharts echarts.init(document.getElementById("china_box"…

117.在 Vue 3 中使用 OpenLayers 实现 CTRL 控制拖拽和滚动缩放

✨ 前言 在使用 OpenLayers 开发地图类项目时,我们有时会希望用户必须按下 CTRL(或 Mac 的 Command ⌘ 键)才能拖拽地图或使用鼠标滚轮缩放。这种交互方式能够避免用户在浏览页面时意外滑动或拖动地图,尤其是在地图嵌入页面中时非常有用。 本文将带你一步一步实现在 Vue …

MATLAB 控制系统设计与仿真 - 34

多变量系统知识回顾 - MIMO system 这一章对深入理解多变量系统以及鲁棒分析至关重要 首先,对于如下系统: 当G(s)为单输入,单输出系统时: 如果: 则: 所以 因此,对于SISO,系统的增益跟w有关系, 当G(s)为MIMO时,例如2X2时, 假设输入信号为:

ARCGIS PRO DSK 利用两期地表DEM数据计算工程土方量

利用两期地表DEM数据计算工程土方量需要准许以下数据&#xff1a; 当前地图有3个图层&#xff0c;两个栅格图层和一个矢量图层 两个栅格图层&#xff1a;beforeDem为工程施工前的地表DEM模型 afterDem为工程施工后的地表DEM模型 一个矢量图层&#xf…

最快打包WPF 应用程序

在 Visual Studio 中右键项目选择“发布”&#xff0c;目标选“文件夹”&#xff0c;模式选“自包含”&#xff0c;生成含 .exe 的文件夹&#xff0c;压缩后可直接发给别人或解压运行&#xff0c;无需安装任何东西。 最简单直接的新手做法&#xff1a; 用 Visual Studio 的“…

物联网通信协议——TCP与MQTT的对比

在物联网通信中&#xff0c;MQTT和TCP的实现方式和原理完全不同&#xff0c;因为两者属于协议栈的不同层级&#xff0c;解决的问题也不同。以下从协议层级、工作机制和典型场景三个角度详细解释&#xff1a; 1. 协议层级与定位 特性TCPMQTT协议层级传输层&#xff08;第4层&am…

【信息系统项目管理师】高分论文:论信息系统项目的成本管理(媒体融合采编平台)

更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 论文1、规划项目成本管理2、估算成本3、制订项目预算4、控制成本论文 2017年7月,我作为项目经理参与了 XX省媒体融合采编平台的建设,该项目总共投资530万元,其中服务器、存储、网络等硬件设备投资200万元、软…

策略模式简单介绍

什么是策略模式&#xff1f;一般用于什么场景&#xff1f; 策略模式一种行为型设计模式&#xff0c;它定义了一系列算法&#xff0c;并将每个算法封装起来&#xff0c;使得它们可以相互替换&#xff0c;这样&#xff0c;客户端可以根据需要在运行时选择合适的算法&#xff0c;…

基于PAI+专属网关+私网连接:构建全链路 Deepseek 云上私有化部署与模型调用架构

DeepSeek - R1 是由深度求索公司推出的首款推理模型&#xff0c;该模型在数学、代码和推理任务上的表现优异&#xff0c;市场反馈火爆。在大模型技术商业化进程中&#xff0c;企业级用户普遍面临四大核心挑战&#xff1a; 算力投入成本高昂&#xff1a;构建千亿参数级模型的训…

【APM】How to enable Trace to Logs on Grafana?

系列文章目录 【APM】Observability Solution 【APM】Build an environment for Traces, Metrics and Logs of App by OpenTelemetry 【APM】NET Traces, Metrics and Logs to OLTP 【APM】How to enable Trace to Logs on Grafana? 前言 本文将介绍如何在Grafana上启用 …