当前位置: 首页 > news >正文

【Java 8新特性】Stream API 和 Lambda 表达式

一、前言

  • Java 8 的 Stream API 和 Lambda 表达式 为集合处理带来了函数式编程风格,显著简化了代码并提高了可读性

二、Lambda 表达式

1.作用

  • 简化匿名内部类的语法,允许将函数作为参数传递
  • 实现函数式接口(只有一个抽象方法的接口),如 Runnable、Comparator。

2.示例

// 传统写法:匿名内部类
Comparator<String> oldComparator = new Comparator<>() {@Overridepublic int compare(String a, String b) {return a.length() - b.length();}
};// Lambda 写法
Comparator<String> lambdaComparator = (a, b) -> a.length() - b.length();

三、Stream API

1.作用

  • 提供声明式数据处理(如过滤、映射、排序、聚合)。
  • 支持链式操作(Lazy Evaluation),优化性能。
  • 并行处理(parallelStream())

四、实际应用场景及代码示例

场景1:筛选+转换

  • 需求:从一个用户列表中提取年龄 >18 的用户的邮箱,并按姓名排序。
List<User> users = Arrays.asList(new User("Alice", 20, "alice@example.com"),new User("Bob", 17, "bob@example.com"),new User("Charlie", 25, "charlie@example.com")
);List<String> emails = users.stream().filter(user -> user.getAge() > 18)         // 过滤条件.sorted(Comparator.comparing(User::getName)) // 按姓名排序.map(User::getEmail)                        // 提取邮箱.collect(Collectors.toList());              // 收集为列表System.out.println(emails); // 输出 [alice@example.com, charlie@example.com]

场景2:聚合统计

  • 需求:计算所有用户的平均年龄。
double averageAge = users.stream().mapToInt(User::getAge)  // 转为 IntStream(优化基本类型操作).average()               // 计算平均值.orElse(0);              // 如果无数据,默认返回 0
System.out.println(averageAge); // 输出 22.5

场景3:分组与映射

  • 需求:按年龄分组,并统计每组的邮箱数量。
Map<Integer, Long> ageToEmailCount = users.stream().collect(Collectors.groupingBy(User::getAge,                  // 按年龄分组Collectors.mapping(User::getEmail,            // 提取邮箱Collectors.counting()      // 统计数量)));
System.out.println(ageToEmailCount); // 输出 {20=1, 25=1}

场景4:并行处理

  • 需求:并行处理大数据集,筛选偶数并求和。
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
int sum = numbers.parallelStream()      // 并行流.filter(n -> n % 2 == 0)            // 筛选偶数.mapToInt(Integer::intValue)        // 转为 int.sum();                             // 求和
System.out.println(sum); // 输出 30

五、核心优势

  • 代码简洁:链式调用替代多层循环和临时变量。
  • 可读性强:操作名称(如 filter、map)直接表达意图。
  • 性能优化:并行流自动利用多核 CPU。
  • 函数式风格:支持更灵活的数据处理逻辑。

六、注意事项

  • 副作用:避免在 Lambda 中修改外部变量(应使用不可变数据)。
  • 性能:小数据量用 stream(),大数据量用 parallelStream()。
  • 资源管理:Stream 是一次性的,终端操作后不能重复使用。

七、总结

  • 通过结合 Stream API 和 Lambda,Java 集合处理代码变得更加简洁、高效且易于维护
http://www.xdnf.cn/news/126415.html

相关文章:

  • MySQL数据库基本操作-DQL-基本查询
  • 多线程事务?拿捏!
  • 豆包桌面版 1.47.4 可做浏览器,免安装绿色版
  • [创业之路-382]:企业法务 - 企业如何通过技术专利与技术秘密保护自己
  • AI赋能Python长时序植被遥感动态分析、物候提取、时空变异归因及RSEI生态评估
  • WebServiceg工具
  • 虾皮(Shopee)商品详情 API 接口概述及 JSON 数据返回参考
  • 《Pinia 从入门到精通》Vue 3 官方状态管理 -- 基础入门篇
  • inih介绍
  • Fragment控件
  • Pytest安装
  • CVPR2025W | S-EO 遥感几何感知阴影检测大规模数据集, 将开源
  • 电商指标体系搭建 - AxureMost
  • Java虚拟机(JVM)家族发展史及版本对比
  • 利用 SSE 实现文字吐字效果:技术与实践
  • 【含文档+PPT+源码】基于SpringBoot+Vue的移动台账管理系统
  • 车载客流记录仪简介
  • 深入解析:`[‘1‘, ‘0‘][101 % 2]` 这种写法在不同编程语言中的实现与应用
  • 交换式以太网
  • 自然语言处理(NLP)技术的实例
  • 函数模板 (Function Templates)
  • OSPF动态路由(单臂路由)
  • Service Worker 离线缓存原理
  • CE第一次作业
  • 基于RK3588/算能BM1684X的智慧厂区AI视觉解决方案
  • BOM与DOM(解疑document window关系)
  • Convenience Variable in GDB
  • 比雅尼·斯特劳斯特鲁普:C++之父
  • SAIL-RK3588协作机器人运动控制器技术方案
  • NestJS 统一异常处理 + 日志追踪链路设计