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

news2025/4/22 21:49:14

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.coloradmin.cn/o/2340361.html

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

相关文章

蓝桥杯2024省A.成绩统计

蓝桥杯2024省A.成绩统计 题目 题目解析与思路 题目要求返回至少要检查多少个人的成绩&#xff0c;才有可能选出k名同学&#xff0c;他们的方差小于一个给定的值 T 二分枚举答案位置&#xff0c;将答案位置以前的数组单独取出并排序&#xff0c;然后用k长滑窗O(1)计算方差 问…

Mac mini 安装mysql数据库以及出现的一些问题的解决方案

首先先去官网安装一下mysql数据库&#xff0c;基本上都是傻瓜式安装的流程&#xff0c;我也就不详细说了。 接下来就是最新版的mysql安装的时候&#xff0c;他就会直接让你设置一个新的密码。 打开设置&#xff0c;拉到最下面就会看到一个mysql的图标&#xff1a; 我设置的就是…

俄罗斯方块-简单开发版

一、需求分析 实现了一个经典的俄罗斯方块小游戏&#xff0c;主要满足以下需求&#xff1a; 1.图形界面 使用 pygame 库创建一个可视化的游戏窗口&#xff0c;展示游戏的各种元素&#xff0c;如游戏区域、方块、分数等信息。 2.游戏逻辑 实现方块的生成、移动、旋转、下落和锁…

你学会了些什么200601?--Flask搭建造测试数据平台

搭建造数平台的环境&#xff1a; ***python3.7 ***html5 ***css ***JavaScript ***Ajax ***MySQL 前台页面的显示 1.为了页面美化&#xff0c;使用了JavaScript&#xff0c;通过逐级展开/隐藏的的方式显示下一级菜单 2.为了在提交表单数据时页面不发生跳转&#xff0c;需要引用…

【音视频】FLV格式分析

FLV概述 FLV(Flash Video)是Adobe公司推出的⼀种流媒体格式&#xff0c;由于其封装后的⾳视频⽂件体积⼩、封装简单等特点&#xff0c;⾮常适合于互联⽹上使⽤。⽬前主流的视频⽹站基本都⽀持FLV。采⽤FLV格式封装的⽂件后缀为.flv。 FLV封装格式是由⼀个⽂件头(file header)和…

Keil5没有stm32的芯片库

下载完重启就行了&#xff0c;我这里就不演示了&#xff0c;stm已经下载&#xff0c;随便选的一个芯片库演示一下

【DVWA 靶场通关】 File Inclusion(文件包含漏洞)

1. 前言 文件包含漏洞 是 Web 应用中较为常见的漏洞之一&#xff0c;攻击者通过操控文件路径&#xff0c;访问或包含系统上的敏感文件&#xff0c;甚至执行恶意代码。DVWA&#xff08;Damn Vulnerable Web Application&#xff09;提供了一个理想的实验环境&#xff0c;让安全…

游戏引擎学习第229天

仓库:https://gitee.com/mrxiao_com/2d_game_5 回顾上次内容并介绍今天的主题 上次留下的是一个非常简单的任务&#xff0c;至少第一步是非常简单的。我们需要在渲染器中加入排序功能&#xff0c;这样我们的精灵&#xff08;sprites&#xff09;才能以正确的顺序显示。为此我…

【C++编程入门】:从零开始掌握基础语法

C语言是通过对C语言不足的地方进行优化创建的&#xff0c;C在C语言之上&#xff0c;C当然也兼容C语言&#xff0c; 在大部分地方使用C比C更方便&#xff0c;可能使用C需要一两百行代码&#xff0c;而C只需要五六十行。 目录 C关键字 命名空间 缺省参数 缺省参数分类 函数…

网络开发基础(游戏方向)之 概念名词

前言 1、一款网络游戏分为客户端和服务端两个部分&#xff0c;客户端程序运行在用户的电脑或手机上&#xff0c;服务端程序运行在游戏运营商的服务器上。 2、客户端和服务端之间&#xff0c;服务端和服务端之间一般都是使用TCP网络通信。客户端和客户端之间通过服务端的消息转…

【源码】【Java并发】【AQS】从ReentrantLock、Semaphore、CutDownLunch、CyclicBarrier看AQS源码

&#x1f44b;hi&#xff0c;我不是一名外包公司的员工&#xff0c;也不会偷吃茶水间的零食&#xff0c;我的梦想是能写高端CRUD &#x1f525; 2025本人正在沉淀中… 博客更新速度 &#x1f44d; 欢迎点赞、收藏、关注&#xff0c;跟上我的更新节奏 &#x1f4da;欢迎订阅专栏…

k8s介绍与实践

第一节 理论 基础介绍&#xff0c;部署实践&#xff0c;操作实践&#xff0c;点击这里学习 第二节 dashboard操作 查看安装的dashboard服务信息 kubectl get pod,svc -n kubernetes-dashboard 网页登录地址&#xff1a;https://server_ip:30976/#/login 创建token kube…

KRaft面试思路引导

Kafka实在2.8之后就用KRaft进行集群管理了 Conroller负责选举Leader&#xff0c;同时Controller管理集群元数据状态信息&#xff0c;并将元数据信息同步给各个分区的Leader 和Zookeeper管理一样&#xff0c;会选出一个Broker作为Controller去管理整个集群&#xff0c;但是元数…

FreeRTOS菜鸟入门(六)·移植FreeRTOS到STM32

目录 1. 获取裸机工程模版 2. 下载 FreeRTOS V9.0.0 源码 3. FreeRTOS文件夹内容简介 3.1 FreeRTOS文件夹 3.1.1 Demo文件夹 3.1.2 License 文件夹 3.1.3 Source 文件夹 3.2 FreeRTOS-Plus 文件夹 4. 往裸机工程添加 FreeRTOS 源码 5. 拷贝 FreeRTOSConfig…

14.第二阶段x64游戏实战-分析人物的名字

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 上一个内容&#xff1a;13.第二阶段x64游戏实战-分析人物等级和升级经验 名字&#xff08;中文英文符号…

【CS*N是狗】亲测可用!!WIN11上禁用Chrome自动更新IDM插件

现象&#xff1a;每次打开chrome后IDM会弹出提示插件版本不一致。经过排查后发现是chrome把IDM插件给更新了&#xff0c;导致IDM提示版本不匹配。经过摸索后&#xff0c;得到了可行的方案。 第一步&#xff0c;打开Chrome&#xff0c;把IDM插件卸载掉&#xff0c;然后重新安装I…

漫游git rebase + 浅谈git checkout和git branch -f的分支命令

今天学了两个命令非常有意思&#xff1a;一个是git checkout&#xff0c;一个是git branch -f。我们可以认为在提交树上&#xff0c;任何一个节点代表着一次提交。并且&#xff0c;git commit将会在 H E A D HEAD HEAD指针指向的节点上进行进一步提交。将每一个分支名视为标记当…

深入理解 React 组件的生命周期:从创建到销毁的全过程

React 作为当今最流行的前端框架之一&#xff0c;其组件生命周期是每个 React 开发者必须掌握的核心概念。本文将全面剖析 React 组件的生命周期&#xff0c;包括类组件的各个生命周期方法和函数组件如何使用 Hooks 模拟生命周期行为&#xff0c;帮助开发者编写更高效、更健壮的…

OpenCV 图形API(44)颜色空间转换-----将图像从 BGR 色彩空间转换为 RGB 色彩空间函数BGR2RGB()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 将图像从BGR色彩空间转换为RGB色彩空间。 该函数将输入图像从BGR色彩空间转换为RGB。B、G和R通道值的常规范围是0到255。 输出图像是8位无符号3通…

配置nginx服务,通过多ip区分多网站

首先关闭防火墙,setenforce 0 关过了,不截图了 多IP,首先配置多个IP地址 可以在vm增加虚拟网卡,也可以在同一网卡配置多个IP,我用第一种 记得点确定 查看新的虚拟网卡IP 没有IP,配置一个 安装nginx 写配置 server{listen 192.168.214.130:80;root /www/ip/130; # 资源根目…