Java进阶-Java Stream API详解与使用

简介: 效、更易于维护的代码,同时享受到函数式编程带来的好处。

一、Java Stream API介绍

  1. Java Stream API简述
    Java Stream API 是Java 8中引入的一项功能,它允许程序员以声明式方式处理数据集合。通过Stream API,可以对数据执行复杂的查询操作,而不必编写冗余的代码。Stream 不是数据结构,它更像是一个高级版本的Iterator。单次使用,数据只能遍历一次,遍历过程中你可以对数据进行过滤、排序、聚合等操作。

  2. Java Stream API支持的功能
    功能 描述
    filter 过滤流中的元素,根据条件只留下满足条件的元素
    map 将流中的每个元素映射成其他形式,结果是一个包含映射后结果的新流
    sorted 确保流中的元素在消费时的顺序按照自然顺序或自定义Comparator排序
    collect 将流转换为其他形式,如List、Set或Map,或者是自定义的收集器
    forEach 遍历流中的每个元素并执行给定的操作
    reduce 通过重复处理其元素来将流减少到单个汇总结果
    anyMatch 检查流中的元素是否有一个满足给定的条件
    allMatch 检查流中的元素是否全部满足给定条件
    noneMatch 检查流中的元素是否没有满足给定条件的
    findFirst 返回流中的第一个元素,如果流为空,则返回空的Optional
    limit 截断流,使其最大长度不超过给定数量
    skip 跳过流中的前n个元素,返回包含余下元素的新流

  3. 使用Java Stream API的优势
    功能 Java Stream API 传统集合操作
    数据处理模式 声明式,支持函数式编程 命令式,代码较为复杂
    内存效率 更高,因为它是在流上直接操作 低,需要复制到新的数据结构
    并发处理 内建支持并发处理 手动处理并发
    可读性 高,流操作可链式调用 低,循环和条件判断多
    使用场景 数据集合操作,大数据处理 小数据量操作
    二、常用的Java Stream API功能
    下面是针对每个Java Stream API函数的示例代码:

  4. filter
    过滤流中的元素,根据条件只留下满足条件的元素。

List numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
List evenNumbers = numbers.stream()
.filter(n -> n % 2 == 0)
.collect(Collectors.toList());
System.out.println(evenNumbers); // 输出 [2, 4, 6]
1
2
3
4
5

  1. map
    将流中的每个元素映射成其他形式,结果是一个包含映射后结果的新流。

List words = Arrays.asList("hello", "world", "java", "stream");
List wordLengths = words.stream()
.map(String::length)
.collect(Collectors.toList());
System.out.println(wordLengths); // 输出 [5, 5, 4, 6]
1
2
3
4
5

  1. sorted
    确保流中的元素在消费时的顺序按照自然顺序或自定义Comparator排序。

List numbers = Arrays.asList(4, 3, 6, 1, 5, 2);
List sortedNumbers = numbers.stream()
.sorted()
.collect(Collectors.toList());
System.out.println(sortedNumbers); // 输出 [1, 2, 3, 4, 5, 6]
1
2
3
4
5

  1. collect
    将流转换为其他形式,如List、Set或Map,或者是自定义的收集器。

List names = Arrays.asList("Alice", "Bob", "Charlie", "David");
Set nameSet = names.stream()
.collect(Collectors.toSet());
System.out.println(nameSet); // 输出 [Alice, Bob, Charlie, David]
1
2
3
4

  1. forEach
    遍历流中的每个元素并执行给定的操作。

List numbers = Arrays.asList(1, 2, 3, 4, 5);
names.stream()
.forEach(System.out::println); // 依次输出 1、2、3、4、5
1
2
3

  1. reduce
    通过重复处理其元素来将流减少到单个汇总结果。

List numbers = Arrays.asList(1, 2, 3, 4, 5);
int sum = numbers.stream()
.reduce(0, Integer::sum);
System.out.println("Sum: " + sum); // 输出 Sum: 15
1
2
3
4

  1. anyMatch
    检查流中的元素是否有一个满足给定的条件。

List numbers = Arrays.asList(1, 2, 3, 4, 5);
boolean hasEven = numbers.stream()
.anyMatch(n -> n % 2 == 0);
System.out.println("Has even numbers: " + hasEven); // 输出 Has even numbers: true
1
2
3
4

  1. allMatch
    检查流中的元素是否全部满足给定条件。

List numbers = Arrays.asList(1, 2, 3, 4, 5);
boolean allEven = numbers.stream()
.allMatch(n -> n % 2 == 0);
System.out.println("All are even: " + allEven); // 输出 All are even: false
1
2
3
4

  1. noneMatch
    检查流中的元素是否没有满足给定条件的。

List numbers = Arrays.asList(1, 2, 3, 4, 5);
boolean noneMultipleOfTen = numbers.stream()
.noneMatch(n -> n % 10 == 0);
System.out.println("None are multiples of ten: " + noneMultipleOfTen); // 输出 None are multiples of ten: true
1
2
3
4

  1. findFirst
    返回流中的第一个元素,如果流为空,则返回空的Optional。

List numbers = Arrays.asList(1, 2, 3, 4, 5);
Optional first = numbers.stream()
.findFirst();
System.out.println("First number: " + first.orElse(-1)); // 输出 First number: 1
1
2
3
4

  1. limit
    截断流,使其最大长度不超过给定数量。

List numbers = Arrays.asList(1, 2, 3, 4, 5);
List limited = numbers.stream()
.limit(3)
.collect(Collectors.toList());
System.out.println(limited); // 输出 [1, 2, 3]
1
2
3
4
5

  1. skip
    跳过流中的前n个元素,返回包含余下元素的新流。

List numbers = Arrays.asList(1, 2, 3, 4, 5);
List skipped = numbers.stream()
.skip(3)
.collect(Collectors.toList());
System.out.println(skipped); // 输出 [4, 5]
1
2
3
4
5
这些示例展示了Java Stream API的多样化和强大功能,使得处理集合数据更加灵活和

三、Java Stream API和类似包比较的优势
Java Stream API 作为Java 8及以后版本的核心特性,对集合和数据流的处理提供了强大的支持。除了Java自带的Stream API,还有一些其他的库或框架也提供了类似的功能,用于处理集合或者数据流。

  1. 常见的Java集合处理库
    Java Stream API - 内置于Java 8及以上版本,提供了一种高级的处理集合的方法,支持函数式编程。
    Apache Commons Collections - 提供了丰富的集合操作工具,但主要是针对Java集合框架之前的版本设计。
    Google Guava - 提供了许多核心Java库没有的集合类型和工具,包括对集合的操作和新的集合类型。
    Vavr(之前称为Javaslang)- 提供了不可变的集合类型和其他函数式编程的工具,以提高代码的健壮性。
    Eclipse Collections(之前称为GS Collections)- 提供了一套丰富的集合库,以及各种性能优化和内存优化的集合类型。
  2. 集合处理库之间的比较
    特性 / 库 Java Stream API Apache Commons Collections Google Guava Vavr Eclipse Collections
    主要优势 内置支持,无需额外依赖 丰富的集合操作工具 强大的集合工具和新集合类型 不可变集合和函数式编程支持 高性能、丰富的集合类型
    集合不可变性 不提供 不提供 提供部分不可变集合 所有集合默认不可变 提供不可变和可变集合
    函数式编程 支持 有限支持 有限支持 完全支持 有限支持
    并发支持 并发流处理 不专门针对并发优化 提供并发集合 不提供 提供优化的并发集合
    类型安全和检查 类型安全 类型安全 类型安全 类型安全 类型安全
    学习曲线 中等 低 中等 高 中等
    与Java版本兼容性 Java 8+ Java 1.2+ Java 1.6+ Java 8+ Java 5+
    扩展集合类型 无 提供额外集合操作 提供新的集合类型 提供函数式集合类型 提供丰富的集合类型
    每个库都有其独特的优点和用途。Java Stream API是Java开发中的标准选项,无需额外依赖且与现代Java应用高度兼容。对于需要在老版本Java上工作的开发者,Apache Commons Collections提供了后向兼容。Google Guava和Eclipse Collections提供了高性能的集合操作,而Vavr则为喜欢函数式编程的开发者提供了很好的支持。选择哪个库取决于具体的项目需求、团队的熟悉度以及对库特性的需求。

四、Java Stream API使用总结
Java Stream API 是一个功能强大的工具,适用于处理集合和数据流。它提供了一种简洁而高效的方法来操作数据,尤其是在处理大量数据时。这个API优化了数据处理逻辑,使开发者能够以更少的代码执行复杂的数据转换和聚合操作。利用Java Stream API,可以轻松实现数据过滤、排序、转换及汇总,极大地提升了代码的可读性和可维护性。同时,Stream API 的函数式编程特性有助于减少错误和侧效应,使得并发程序的编写更为安全。通过使用Java Stream API,开发者可以写出更简洁、更高效、更易于维护的代码,同时享受到函数式编程带来的好处。

相关文章
|
3月前
|
前端开发 Cloud Native Java
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
|
3月前
|
缓存 安全 Java
《从头开始学java,一天一个知识点》之:字符串处理:String类的核心API
🌱 **《字符串处理:String类的核心API》一分钟速通!** 本文快速介绍Java中String类的3个高频API:`substring`、`indexOf`和`split`,并通过代码示例展示其用法。重点提示:`substring`的结束索引不包含该位置,`split`支持正则表达式。进一步探讨了String不可变性的高效设计原理及企业级编码规范,如避免使用`new String()`、拼接时使用`StringBuilder`等。最后通过互动解密游戏帮助读者巩固知识。 (上一篇:《多维数组与常见操作》 | 下一篇预告:《输入与输出:Scanner与System类》)
99 11
|
4月前
|
数据采集 JSON Java
Java爬虫获取微店快递费用item_fee API接口数据实现
本文介绍如何使用Java开发爬虫程序,通过微店API接口获取商品快递费用(item_fee)数据。主要内容包括:微店API接口的使用方法、Java爬虫技术背景、需求分析和技术选型。具体实现步骤为:发送HTTP请求获取数据、解析JSON格式的响应并提取快递费用信息,最后将结果存储到本地文件中。文中还提供了完整的代码示例,并提醒开发者注意授权令牌、接口频率限制及数据合法性等问题。
|
4月前
|
数据采集 存储 Java
Java爬虫获取微店店铺所有商品API接口设计与实现
本文介绍如何使用Java设计并实现一个爬虫程序,以获取微店店铺的所有商品信息。通过HttpClient发送HTTP请求,Jsoup解析HTML页面,提取商品名称、价格、图片链接等数据,并将其存储到本地文件或数据库中。文中详细描述了爬虫的设计思路、代码实现及注意事项,包括反爬虫机制、数据合法性和性能优化。此方法可帮助商家了解竞争对手,为消费者提供更全面的商品比较。
|
5月前
|
算法 Java 程序员
菜鸟之路Day06一一Java常用API
《菜鸟之路Day06——Java常用API》由blue编写,发布于2025年1月24日。本文详细介绍了Java中常用的API,包括JDK7的时间类(Date、SimpleDateFormat、Calendar)和JDK8新增的时间API(ZoneId、Instant、DateTimeFormatter等),以及包装类的使用。通过多个实例练习,如时间计算、字符串转整数、十进制转二进制等,帮助读者巩固所学内容,提升编程技能。文章强调了理论与实践结合的重要性,鼓励读者多做练习以提高学习效率。
134 28
|
4月前
|
数据采集 算法 Java
如何在Java爬虫中设置动态延迟以避免API限制
如何在Java爬虫中设置动态延迟以避免API限制
|
4月前
|
缓存 Java 应用服务中间件
java语言后台管理若依框架-登录提示404-接口异常-系统接口404异常如何处理-登录验证码不显示prod-api/captchaImage 404 (Not Found) 如何处理-解决方案优雅草卓伊凡
java语言后台管理若依框架-登录提示404-接口异常-系统接口404异常如何处理-登录验证码不显示prod-api/captchaImage 404 (Not Found) 如何处理-解决方案优雅草卓伊凡
800 5
|
5月前
|
JSON Java 数据挖掘
利用 Java 代码获取淘宝关键字 API 接口
在数字化商业时代,精准把握市场动态与消费者需求是企业成功的关键。淘宝作为中国最大的电商平台之一,其海量数据中蕴含丰富的商业洞察。本文介绍如何通过Java代码高效、合规地获取淘宝关键字API接口数据,帮助商家优化产品布局、制定营销策略。主要内容包括: 1. **淘宝关键字API的价值**:洞察用户需求、优化产品标题与详情、制定营销策略。 2. **获取API接口的步骤**:注册账号、申请权限、搭建Java开发环境、编写调用代码、解析响应数据。 3. **注意事项**:遵守法律法规与平台规则,处理API调用限制。 通过这些步骤,商家可以在激烈的市场竞争中脱颖而出。
|
6月前
|
JSON Java Apache
Java基础-常用API-Object类
继承是面向对象编程的重要特性,允许从已有类派生新类。Java采用单继承机制,默认所有类继承自Object类。Object类提供了多个常用方法,如`clone()`用于复制对象,`equals()`判断对象是否相等,`hashCode()`计算哈希码,`toString()`返回对象的字符串表示,`wait()`、`notify()`和`notifyAll()`用于线程同步,`finalize()`在对象被垃圾回收时调用。掌握这些方法有助于更好地理解和使用Java中的对象行为。
|
6月前
|
算法 Java API
如何使用Java开发获得淘宝商品描述API接口?
本文详细介绍如何使用Java开发调用淘宝商品描述API接口,涵盖从注册淘宝开放平台账号、阅读平台规则、创建应用并申请接口权限,到安装开发工具、配置开发环境、获取访问令牌,以及具体的Java代码实现和注意事项。通过遵循这些步骤,开发者可以高效地获取商品详情、描述及图片等信息,为项目和业务增添价值。
212 10