Java进阶-JavaStreamAPI的使用

news2024/11/26 22:32:42

本文全面介绍了 Java Stream API 的概念、功能以及如何在 Java 中有效地使用它进行集合和数据流的处理。通过详细解释和示例,文章展示了 Java Stream API 在简化代码、提高效率以及支持函数式编程方面的优势。文中还比较了 Java Stream API 与其他集合处理库的异同,强调了其在现代 Java 开发中的重要性和实用性。
在这里插入图片描述


一、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函数的示例代码:

1. filter

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

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

2. map

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

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

3. sorted

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

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

4. collect

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

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

5. forEach

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

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

6. reduce

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

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

7. anyMatch

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

List<Integer> 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

8. allMatch

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

List<Integer> 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

9. noneMatch

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

List<Integer> 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

10. findFirst

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

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

11. limit

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

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

12. skip

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

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> skipped = numbers.stream()
                               .skip(3)
                               .collect(Collectors.toList());
System.out.println(skipped); // 输出 [4, 5]

这些示例展示了Java Stream API的多样化和强大功能,使得处理集合数据更加灵活和


三、Java Stream API和类似包比较的优势

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

1. 常见的Java集合处理库

  1. Java Stream API - 内置于Java 8及以上版本,提供了一种高级的处理集合的方法,支持函数式编程。
  2. Apache Commons Collections - 提供了丰富的集合操作工具,但主要是针对Java集合框架之前的版本设计。
  3. Google Guava - 提供了许多核心Java库没有的集合类型和工具,包括对集合的操作和新的集合类型。
  4. Vavr(之前称为Javaslang)- 提供了不可变的集合类型和其他函数式编程的工具,以提高代码的健壮性。
  5. Eclipse Collections(之前称为GS Collections)- 提供了一套丰富的集合库,以及各种性能优化和内存优化的集合类型。

2. 集合处理库之间的比较

特性 / 库Java Stream APIApache Commons CollectionsGoogle GuavaVavrEclipse 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,开发者可以写出更简洁、更高效、更易于维护的代码,同时享受到函数式编程带来的好处。

在这里插入图片描述

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

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

相关文章

matlab学习007-已知离散时间系统的系统函数并使用matlab绘制该系统的零极点图;判断系统的稳定性;幅频和相频特性曲线

目录 题目 离散时间系统的系统函数&#xff1a;H(z)(3*z^3-5*z^210z)/(z^3-3*z^27*z-5) 1&#xff0c;绘制该系统的零极点图 1&#xff09;零极点图 2&#xff09;代码 2&#xff0c;判断系统的稳定性 1&#xff09;判断结果 2&#xff09;代码 3&#xff0c;试用MATL…

SpringMVC基础篇(四)

文章目录 1.视图1.基本介绍1.视图介绍2.为什么需要自定义视图 2.自定义视图实例1.思路分析2.代码实例1.view.jsp2.接口3.配置自定义视图解析器springDispatcherServlet-servlet.xml4.自定义视图MyView.java5.view_result.jsp6.结果展示 3.自定义视图执行流程4.自定义视图执行流…

最新官方破解版会声会影2024永久序列号和激活码

会声会影2024是一款功能强大的视频编辑软件&#xff0c;它集合了视频剪辑、音频调整、特效添加等多项功能于一身&#xff0c;为用户提供了一个全面且易用的视频制作平台。无论是初学者还是专业视频编辑人员&#xff0c;都能在这款软件中找到满足自己创作需求的工具。 会声会影最…

生成对抗网络的无载体信息隐藏算法简介

一、研究背景 随着互联网技术的广泛应用和移动智能设备的快速普及&#xff0c;人们有了更多的途径传播和获取信息。每天海量的数据以视频、音频、图像、文字等各类形式在互联网中产生&#xff0c;这为人们的生活带来了极大的便利&#xff0c;但同时也引起了人们对信息泄露的担…

《QT实用小工具·四十六》多边形窗口

1、概述 源码放在文章末尾 该项目实现了可以移动的多边形窗口&#xff0c;项目demo演示如下所示&#xff1a; 项目部分代码如下所示&#xff1a; #include "polygonwindow.h"#include <QBitmap> #include <QQuickItem> #include <QQmlFile> #in…

[NeurIPS-23] GOHA: Generalizable One-shot 3D Neural Head Avatar

[pdf | proj | code] 本文提出一种基于单图的可驱动虚拟人像重建框架。基于3DMM给粗重建、驱动结果&#xff0c;基于神经辐射场给细粒度平滑结果。 方法 给定源图片I_s和目标图片I_t&#xff0c;希望生成图片I_o具有源图片ID和目标图片表情位姿。本文提出三个分支&#xff1a;…

AI大模型探索之路-训练篇7:大语言模型Transformer库之HuggingFace介绍

系列篇章&#x1f4a5; AI大模型探索之路-训练篇1&#xff1a;大语言模型微调基础认知 AI大模型探索之路-训练篇2&#xff1a;大语言模型预训练基础认知 AI大模型探索之路-训练篇3&#xff1a;大语言模型全景解读 AI大模型探索之路-训练篇4&#xff1a;大语言模型训练数据集概…

Web前端开发之CSS_2

关系选择器CSS盒子模型弹性盒子模型文档流浮动清除浮动定位 1. 关系选择器 1.1 后代选择器 E F{} 选择所有被 E 元素包含的 F 元素&#xff0c;中间用空格隔开 <ul> <li>后代列表1</li> <div> <ol> <li>后代列表2</li> </ol>…

20240428如何利用IDM下载磁链视频

缘起&#xff1a; https://weibo.com/tv/show/1034:4864336909500449 中国获奖独立纪录片《阿辉》揭秘红灯区“教父”的生存法则 5,751次观看 1年前 发布于 陕西 身为里中横 67.7万粉丝 互联网科技博主 微博原创视频博主 头条文章作者 https://weibo.com/tv/show/1034:4864…

深度学习:基于Keras框架,使用神经网络模型对葡萄酒类型进行预测分析

前言 系列专栏&#xff1a;机器学习&#xff1a;高级应用与实践【项目实战100】【2024】✨︎ 在本专栏中不仅包含一些适合初学者的最新机器学习项目&#xff0c;每个项目都处理一组不同的问题&#xff0c;包括监督和无监督学习、分类、回归和聚类&#xff0c;而且涉及创建深度学…

数据结构 - C/C++

快速跳转 数组链表栈队列串树 目录 数据结构 逻辑结构 物理结构 数据结构 数据 数据不仅仅包括整型、实型等数值类型&#xff0c;还包括字符及声音、图像、视频等非数值类型。 计算机可以理解并按照指定格式处理。 结构 元素相互之间存在一种或多种特定关系的数据集合。 …

Docker如何开启远程访问?

Docker是一种开源的容器化平台&#xff0c;通过将应用程序和其依赖项打包成容器&#xff0c;可以实现快速部署、弹性运行和简化管理。默认情况下&#xff0c;Docker的运行环境是局域网内的单机&#xff0c;但有时我们需要在不同地区的电脑、设备之间进行远程通信。本篇文章将介…

上市企业数字赋能指数数据集-2001到2022年(TF-IDF)

01、数据简介 上市公司数字赋能指数是一个用来衡量上市公司利用数字技术提高业务能力和效率的指标。这个指数反映了上市公司利用大数据、云计算和人工智能等数字技术&#xff0c;高效地利用商业资源和信息&#xff0c;并扩展供应关系的能力。市公司数字赋能指数是一种综合性的…

区间预测 | PSO-RF-KDE的粒子群优化随机森林结合核密度估计多变量回归区间预测(Matlab)

区间预测 | PSO-RF-KDE的粒子群优化随机森林结合核密度估计多变量回归区间预测&#xff08;Matlab&#xff09; 目录 区间预测 | PSO-RF-KDE的粒子群优化随机森林结合核密度估计多变量回归区间预测&#xff08;Matlab&#xff09;效果一览基本介绍程序设计参考资料 效果一览 基…

web安全---xss漏洞/beef-xss基本使用

what xss漏洞----跨站脚本攻击&#xff08;Cross Site Scripting&#xff09;&#xff0c;攻击者在网页中注入恶意脚本代码&#xff0c;使受害者在浏览器中运行该脚本&#xff0c;从而达到攻击目的。 分类 反射型---最常见&#xff0c;最广泛 用户将带有恶意代码的url打开&a…

websocket 单点通信,广播通信

Websocket协议是对http的改进&#xff0c;可以实现client 与 server之间的双向通信&#xff1b; websocket连接一旦建立就始终保持&#xff0c;直到client或server 中断连接&#xff0c;弥补了http无法保持长连接的不足&#xff0c;方便了客户端应用与服务器之间实时通信。 参…

信息系统管理

目录 一、信息系统管理范围 1、规划和组织 2、设计和实施 ①、信息系统架构 Ⅰ、集中式架构 Ⅱ、分布式架构 Ⅲ、SOA&#xff08;面向服务的系统架构&#xff09; 3、运维和服务 ①、运行管理和控制 ②、IT服务管理 ③、运行与监控 Ⅰ、运行监控 Ⅱ、安全监控 4、…

【题解】—— LeetCode一周小结17

【题解】—— 每日一道题目栏 上接&#xff1a;【题解】—— LeetCode一周小结16 22.组合总和 Ⅳ 题目链接&#xff1a;377. 组合总和 Ⅳ 给你一个由 不同 整数组成的数组 nums &#xff0c;和一个目标整数 target 。请你从 nums 中找出并返回总和为 target 的元素组合的个数…

01.Kafka简介与基本概念介绍

1 Kafka 简介 Kafka 是最初由 Linkedin公司开发&#xff0c;是一个分布式、支持分区(partition)的、多副本(replica)的&#xff0c;基于 Zookeeper 协调的分布式消息系统&#xff0c;它的最大的特性就是可以实时的处理大量数据以满足各种需求场景&#xff1a;比如基于 hadoop 的…

SpringBoot 快速开始 Dubbo RPC

文章目录 SpringBoot 快速开始 Dubbo RPC下载 Nacos项目启动项目的创建创建主项目接口定义服务的创建Dubbo 服务提供者的创建服务的消费者创建 添加依赖给 Provider、Consumer 添加依赖 开始写代码定义接口在 Provider 中实现在 Consumer 里面使用创建启动类 注册中心配置启动 …