Java Stream

1. Stream API概述

        Java 8 Stream是Java 8中引入的一个新的API,用于处理集合和数组等数据结构的元素。它允许您在数据集上进行功能性操作,例如过滤、映射、排序等,而不需要编写循环或迭代器等底层代码。

        Java 8 Stream与集合不同,它并不是一个数据结构,而是一种可操作的流。流可以是无限的,也可以是有限的。在使用流进行操作时,不会改变原始数据集合中的数据,而是返回一个新的流。

        Stream API包含了丰富的操作方法,例如过滤、映射、排序、归约等,使得对数据集合进行操作变得非常方便。Java 8 Stream的使用可以极大地简化代码,并提高代码的可读性和可维护性。

2. 初识Stream API

        用一个案例来认识StreamAPI的使用:过滤“J”开头的用户名。

        方式一:用传统的循环方式处理

List<String> names = Arrays.asList("John", "Jane", "Bob", "Tom");
//传统Java编码实现找出J开头的人名
List<String> jNames = new ArrayList<>();
for (String name : names){if (name.startsWith("J")){jNames.add(name);}
}
System.out.println(jNames);// 输出:[John, Jane]

        方式二:用 Stream API

//使用Stream API实现找出J开头的人名
List<String> filteredNames = names.stream().filter(name -> name.startsWith("J")).collect(Collectors.toList());
System.out.println(filteredNames); // 输出:[John, Jane]

        上述代码中采用了两种方式实现了过滤“J”开头的用户名,一种是传统for循环方式,另外一种就是Stream API。可以看到使用Stream方式可以大大简化代码。Stream方式中,先使用stream()方法将集合转换为流,然后使用filter()方法筛选以“J”开头的字符串,最后使用collect()方法将筛选后的结果转换为List集合。

3. 常用Stream API方法

        Java 8中常用的Stream API主要包括以下几个:

  • filter:过滤流中的元素,只保留符合条件的元素
  • map:对流中的元素进行映射,将一个元素映射为另一个元素
  • flatMap:对流中的元素进行扁平化映射,将一个元素映射为多个元素
  • sorted:对流中的元素进行排序
  • distinct:去重,保留流中的不同元素
  • limit:限制流中元素的数量
  • skip:跳过流中的前N个元素
  • forEach:遍历流中的元素
  • reduce:对流中的元素进行归约,得到一个结果
  • collect:将流中的元素收集到一个集合中
  • min和max:找出流中的最小值和最大值
  • count:统计流中元素的数量
  • anyMatch、allMatch和noneMatch:判断流中的元素是否满足某个条件
  • findFirst和findAny:找到流中的第一个元素和任意一个元素
  • parallel和sequential:切换流的并行和串行模式

        上述API定义在集合类和Collectors类上,可以让我们对流进行过滤、映射、排序、去重、统计、归约等常见的操作,并且提供了并行处理的支持,可以充分利用多核处理器的性能,提高程序的执行效率。

4. Stream API的使用步骤

        Java 8 Stream API的使用方法主要分为以下几个步骤:

        1、创建流

        通过集合、数组或者Stream类中提供的静态方法创建流。例如,通过集合创建流:

List<String> list = Arrays.asList("apple", "banana", "orange");
Stream<String> stream = list.stream();

        2、中间操作

        对流进行中间操作,可以使用filter、map、flatMap、sorted、distinct、limit、skip等操作。例如,使用filter方法过滤集合中的元素:

stream = stream.filter(s -> s.startsWith("a"));

        3、终止操作

        对流进行终止操作,可以使用forEach、reduce、collect、min、max、count等操作。例如,使用forEach方法遍历流中的元素:

stream.forEach(System.out::println);

        4、并行处理

        对于大数据集,可以使用并行流来提高程序的执行效率,可以使用parallel和sequential方法来切换并行和串行模式。例如,使用parallel方法将流转换为并行流:

stream = stream.parallel();

        以上是Java 8 Stream API的使用方法,可以通过这些步骤来创建、操作和处理流。需要注意的是,在使用Stream API时,应该避免在操作中修改流中的元素,以免出现意外的结果。

5. Stream API的使用示例

        1、筛选数据

        筛选数据:筛选以“J”开头的字符串。代码示意如下:

List<String> names = Arrays.asList("John", "Jane", "Bob", "Tom");
List<String> filteredNames = names.stream().filter(name -> name.startsWith("J")).collect(Collectors.toList());
System.out.println(filteredNames); // 输出:[John, Jane]

        上述代码中,使用stream()方法将集合转换为流,然后使用filter()方法筛选以“J”开头的字符串,最后使用collect()方法将筛选后的结果转换为List集合。

        2、映射数据

        映射字符串的长度,代码示意如下:

List<String> names = Arrays.asList("John", "Jane", "Bob", "Tom");
List<Integer> nameLengths = names.stream().map(String::length).collect(Collectors.toList());
System.out.println(nameLengths); // 输出:[4, 4, 3, 3]

        上述代码中,使用stream()方法将集合转换为流,然后使用map()方法将字符串映射为字符串长度,最后使用collect()方法将映射后的结果转换为List集合。

        3、统计数据

        统计数据,代码示意如下:

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
long count = numbers.stream().count();
int max = numbers.stream().max(Integer::compare).orElse(0);
int min = numbers.stream().min(Integer::compare).orElse(0);
int sum = numbers.stream().mapToInt(Integer::intValue).sum();
double average = numbers.stream().mapToInt(Integer::intValue).average().orElse(0.0);
System.out.println("Count: " + count); // 输出:Count: 5
System.out.println("Max: " + max); // 输出:Max: 5
System.out.println("Min: " + min); // 输出:Min: 1
System.out.println("Sum: " + sum); // 输出:Sum: 15
System.out.println("Average: " + average); // 输出:Average: 3.0

        上述代码中,使用count()方法统计流中元素的个数,使用max()和min()方法求出流中的最大值和最小值,使用sum()方法求出流中元素的总和,使用average()方法求出流中元素的平均值。

        4、排序数据

        实现数据排序,代码示意如下:

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

        上述代码中,使用sorted()方法对流中的元素进行排序,最后使用collect()方法将排序后的结果转换为List集合。

        以上是一些Java 8 Stream API的基本案例,这些案例只是展示了Stream API的基本用法,还有更多丰富的操作可以使用,例如归约、去重、分组、分区等。

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

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

相关文章

动态表名 的使用方法

动态表名插件的底层是 拦截器 1&#xff0c;创建一个拦截器 Configuration public class MybatisConfiguration {Beanpublic DynamicTableNameInnerInterceptor dynamicTableNameInnerInterceptor() {// 准备一个Map&#xff0c;用于存储TableNameHandlerMap<String, Table…

MySQL索引(聚簇索引、非聚簇索引)

了解MySQL索引详细&#xff0c;本文只做整理归纳&#xff1a;https://blog.csdn.net/wangfeijiu/article/details/113409719 概念 索引是对数据库表中一列或多列的值进行排序的一种结构&#xff0c;使用索引可快速访问数据库表中的特定信息。 索引分类 主键索引&#xff1a…

Conda安装rasterio报错

Conda安装rasterio报错 文章目录 Conda安装rasterio报错问题解决参考 问题 在conda环境中安装rasterio包之后&#xff0c;本来可以正常运行的&#xff0c;但是之后又重新安装了一个gdal&#xff0c;导致原来的引用rasterio的包的程序不可正常运行了 conda install rasterio c…

基于Springboot的民航网上订票系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的民航网上订票系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构…

[附源码]石器时代_恐龙宝贝内购版_三网H5手游_带GM工具

石器时代之恐龙宝贝内购版_三网H5经典怀旧Q萌全网通手游_Linux服务端源码_视频架设教程_GM多功能授权后台_CDK授权后台 本教程仅限学习使用&#xff0c;禁止商用&#xff0c;一切后果与本人无关&#xff0c;此声明具有法律效应&#xff01;&#xff01;&#xff01;&#xff0…

Ftp笑脸漏洞(VSFTPD 2.3.4)复现(后门漏洞)

Ftp笑脸漏洞&#xff08;VSFTPD 2.3.4&#xff09;复现&#xff08;后门漏洞&#xff09; 一、原理二、复现准备三、漏洞复现四、Metasploit利用脚本复现 一、原理 vsftpd 是“ very secure FTP daemon ”的缩写&#xff0c;安全性是它的一个最大的特点。 vsftpd是一个 UNIX 类…

数学:人工智能领域的基石与灵魂

在科技日新月异的今天&#xff0c;人工智能&#xff08;AI&#xff09;已经渗透到了我们生活的方方面面&#xff0c;从智能家居、智能医疗到自动驾驶、智能客服&#xff0c;AI无处不在。然而&#xff0c;当我们赞叹于AI的神奇时&#xff0c;却往往忽视了其背后的推动力——数学…

Go PDF文件操作

目录 介绍 安装 gofpdf API 代码示例 结果展示 介绍 gofpdf 是一个在 Go 语言中用于生成 PDF 文档的库。 安装 gofpdf 首先&#xff0c;你需要安装 gofpdf 库。你可以使用 go get 命令来安装它&#xff1a; go get github.com/jung-kurt/gofpdf API 功能 函数名参数解释示…

车载测试系列:自动驾驶中间件SOME/IP

一、以太网引入汽车 2004年&#xff0c;宝马汽车的OBD诊断口采用的是高速CAN总线&#xff0c;速率为500kbit/s&#xff0c;除去CAN协议本身的开销&#xff0c;通过OBD口升级控制器的净升级速度降到200kbit/s。预计到2008年&#xff0c;软件更新的数据量会达到1GB&#xff0c;按…

串口初始化自己独立的见解--第九天

1.SM0,SM1 我们一般用 8位UART&#xff0c;波特率可变 &#xff08;方式1的工作方式&#xff09; SCON &#xff1a;SM2 一般不用&#xff0c;SM0 0 ,SM1 1 PCON : 有两位 我们不动它&#xff0c;不加速&#xff0c;初始值 TMOD&#xff1a;8位自动重装定时器&#xff0…

如何自动(定时/间隔/重复)执行 同步文件、备份打包加密压缩文件

参考下列两个教程结合使用即可&#xff1a; 快捷自由定时重启、注销、关机 如何从多个文件夹内转移全部文件&#xff08;忽略文件夹的结构&#xff09;&#xff08;进行复制&#xff09;&#xff08;再打包&#xff09; 就是先设定好 勾选对 来源路径’Zip打包&#xff0c;并…

QT作业5

1、聊天室 服务器端 //头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTcpServer> #include <QTcpSocket> #include <QList> #include <QListWidget> #include <QMessageBox> #include <QDebug> #includ…

渗透之sql注入----二次注入

目录 二次注入的原理&#xff1a; 实战&#xff1a; 第一步&#xff1a;找注入点 找漏洞&#xff1a; 注入大概过程&#xff1a; 第二步&#xff1a;开始注入 二次注入的原理&#xff1a; 二次注入是由于对用户输入的数据过滤不严谨&#xff0c;导致存在异常的数据被出入…

通俗的理解网关的概念的用途(三):你的数据包是如何到达下一层的

其实&#xff0c;这一章我写不好&#xff0c;因为这其中会涉及到一些计算和一些广播等概念&#xff0c;本人不善于此项。在此略述&#xff0c;可以参考。 每台设备的不同连接在获得有效的IP地址后&#xff0c;会根据IP地址的规则和掩码的规则&#xff0c;在操作系统和交换机&a…

暴力数据结构之栈与队列(队列详解)

1.队列的定义 队列是一种特殊的线性表&#xff0c;它遵循先进先出&#xff08;FIFO&#xff09;的原则。在队列中&#xff0c;只允许在表的一端进行插入操作&#xff08;队尾&#xff09;&#xff0c;而在另一端进行删除操作&#xff08;队头&#xff09;。这种数据结构确保了最…

基于Springboot的微乐校园管理系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的微乐校园管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构…

Java设计模式 _结构型模式_外观模式

一、外观模式 1、外观模式 外观模式&#xff08;Facade Pattern&#xff09;是一种结构型模式。主要特点为隐藏系统的复杂性&#xff0c;并向客户端提供了一个客户端可以访问系统的接口。这有助于降低系统的复杂性&#xff0c;提高可维护性。当客户端与多个子系统之间存在大量…

【MQTT】mosquitto 的 “下载、交叉编译、使用” 详细教程,手把手搭建一个MQTT Broker

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

传统企业如何实现数字化转型?

随着信息技术的迅猛发展和互联网的普及&#xff0c;数字化转型已经成为企业和组织不可忽视的趋势&#xff0c;数字化转型对企业和组织来说是必要的&#xff0c;它可以提升竞争力&#xff0c;推动创新发展&#xff0c;实现数据驱动决策&#xff0c;提升用户体验并适应未来发展。…