Java 8中的Stream API

Java 8引入了一种全新的数据处理方式:Stream。Stream API提供了一种功能强大、高效、可复合、并行处理集合数据的方式。使用Stream API,我们可以轻松地对集合进行筛选、排序、过滤、映射等操作。在本教程中,我们将深入介绍Stream API的原理、应用和示例代码。

什么是Stream

Stream是Java 8中的一个新概念,它可以看作是一种数据流,它本身并不存储数据,而是在对数据源进行处理时生成一连串的元素组成的流。这些元素可以是基本类型、对象、集合等。

Stream API主要包含以下两个接口:

  • Stream:表示一个元素序列,可以是基本类型、对象或者集合等。
  • IntStream、LongStream、DoubleStream:表示元素为基本类型int、long、double的序列。

Stream API提供了一种类似于SQL语句的查询机制,包括:过滤、映射、聚合等操作。

Stream API的核心思想是把集合中的数据转换为流,在流中对数据进行操作,然后再把流转换为集合。这个过程中,不需要对集合中的数据进行手动操作,而是通过Stream API提供的方法来完成。

一、Stream的基本操作

Stream API中的基本操作可以分为以下三类:

中间操作

中间操作可以对Stream进行转换、筛选、排序等操作,返回一个新的Stream对象。

中间操作可以分为以下几种:

  1. filter():根据条件过滤元素。
  2. map():对元素进行映射。
  3. flatMap():将多个流合并成一个流。
  4. distinct():去除重复元素。
  5. sorted():对元素进行排序。
  6. peek():对每个元素执行一个操作,但是不会修改流中的元素。
  7. limit():限制元素数量。
  8. skip():跳过指定数量的元素。
  9. parallel():将流转换为并行流,提高处理效率。

中止操作

中止操作是最终操作,它会生成一个结果或副作用。在执行中止操作后,Stream将无法再使用。

中止操作可以分为以下几种:

  1. forEach():对每个元素执行指定的操作。
  2. toArray():将元素转换为数组。
  3. reduce():对元素进行归约。
  4. collect():将元素收集到集合中。
  5. count():计算元素数量。
  6. anyMatch():判断是否有元素匹配给定的条件。
  7. allMatch():判断是否所有元素都匹配给定的条件。
  8. noneMatch():判断是否没有元素匹配给定的条件。
  9. findFirst():返回第一个元素。
  10. findAny():返回任意一个元素。

短路操作

短路操作是一种特殊的中止操作,当满足某些条件时,它们可以提前停止操作,不必遍历所有的元素。

短路操作可以分为以下几种:

  1. anyMatch():判断是否有元素匹配给定的条件。
  2. allMatch():判断是否所有元素都匹配给定的条件。
  3. noneMatch():判断是否没有元素匹配给定的条件。
  4. findFirst():返回第一个元素。
  5. findAny():返回任意一个元素。

二、Stream的使用示例

下面通过一些示例来演示Stream的使用。

过滤元素

假设有一个字符串列表,我们需要过滤掉所有长度小于3的字符串,并打印出剩下的字符串。可以使用filter()方法来过滤元素,代码如下:

List<String> list = Arrays.asList("java", "python", "scala", "c++", "c#");
list.stream().filter(s -> s.length() >= 3).forEach(System.out::println);

输出结果为:

java
python
scala
c++

映射元素

假设有一个字符串列表,我们需要把每个字符串转换为大写并打印出来。可以使用map()方法来映射元素,代码如下:

List<String> list = Arrays.asList("java", "python", "scala", "c++", "c#");
list.stream().map(String::toUpperCase).forEach(System.out::println);

输出结果为:

JAVA
PYTHON
SCALA
C++
C#

归约操作

假设有一个整数列表,我们需要计算它们的总和。可以使用reduce()方法来进行归约操作,代码如下:

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
int sum = list.stream().reduce(0, (a, b) -> a + b);
System.out.println(sum);

输出结果为:

15

统计元素

假设有一个整数列表,我们需要统计其中偶数的个数。可以使用filter()方法和count()方法来统计元素,代码如下:

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
long count = list.stream().filter(i -> i % 2 == 0).count();
System.out.println(count);

输出结果为:

2

并行处理

Stream API还支持并行处理。在处理大量数据时,可以使用并行流来提高处理效率。下面是一个计算1到100的所有数字之和的例子,可以分别使用串行流和并行流来计算:

// 串行流
long sum1 = IntStream.rangeClosed(1, 100).reduce(0, (a, b) -> a + b);
System.out.println(sum1);// 并行流
long sum2 = IntStream.rangeClosed(1, 100).parallel().reduce(0, (a, b) -> a + b);
System.out.println(sum2);

输出结果为:

5050
5050

可以看到,使用并行流处理的时间更短。

Stream中的延迟执行

Stream API中的操作可以分为两种:中间操作和终端操作。中间操作返回的仍然是Stream对象,可以继续进行操作,而终端操作则返回一个非Stream类型的对象。

Stream中的操作是延迟执行的,也就是说,只有在执行终端操作时才会进行实际的计算。这种设计可以优化Stream的性能,例如可以避免对不必要的元素进行操作,或者可以合并多个操作以提高效率。

下面是一个示例,假设有一个字符串列表,我们需要将其中长度大于3的字符串转换为大写并打印出来。可以使用以下代码:

List<String> list = Arrays.asList("java", "python", "scala", "c++", "c#");
list.stream().filter(s -> s.length() > 3).map(String::toUpperCase).forEach(System.out::println);

输出结果为:

JAVA
PYTHON
SCALA

可以看到,只有满足filter()的条件才会执行map()操作,这种延迟执行的设计可以提高程序的性能。

三、Stream中的并行处理

Stream API提供了并行处理的支持,可以将一个流分成多个子流进行并行处理,从而提高处理效率。使用并行流处理数据时,需要注意以下几点:

  1. 并行流适合处理大量的数据。
  2. 处理有序数据时,会影响处理的效率。
  3. 处理数据时,需要确保没有竞争条件。

下面是一个示例,假设有一个整数列表,我们需要统计其中偶数的个数。可以使用以下代码:

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
long count = list.parallelStream().filter(i -> i % 2 == 0).count();
System.out.println(count);

输出结果为:

5

可以看到,并行处理的效率比串行处理的效率更高。

四、总结

本文对Java 8中的Stream进行了介绍,包括Stream的概念、Stream的操作和Stream的特点。Stream是一种函数式编程的概念,可以方便地处理集合中的元素,并提供了多种操作方式。使用Stream API可以简化代码的编写,并提高程序的性能。

在使用Stream时,需要注意Stream的操作是延迟执行的,只有在执行终端操作时才会进行实际的计算。此外,Stream API还提供了并行处理的支持,可以将一个流分成多个子流进行并行处理,从而提高处理效率。在使用并行处理时,需要注意处理有序数据时,会影响处理的效率,并且需要确保没有竞争条件。

最后,我们再次强调Stream API的优点:Stream API可以简化代码的编写,并提高程序的性能。使用Stream API可以减少代码量,并提高代码的可读性。使用Stream API可以方便地对集合中的元素进行操作,并且可以提供多种操作方式。使用Stream API可以使用Lambda表达式来定义数据的处理方式,从而提高程序的可维护性。

示例代码

为了更好地理解Stream API的使用,本文提供了以下示例代码:

import java.util.Arrays;
import java.util.List;public class StreamDemo {public static void main(String[] args) {// 集合转换为Stream对象List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);list.stream().forEach(System.out::println);// 数组转换为Stream对象int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};Arrays.stream(arr).forEach(System.out::println);// 创建一个无限流Stream.iterate(0, n -> n + 2).limit(10).forEach(System.out::println);// 使用map操作转换Stream中的元素List<String> strList = Arrays.asList("java", "python", "scala", "c++", "c#");strList.stream().map(String::toUpperCase).forEach(System.out::println);// 使用filter操作过滤Stream中的元素List<Integer> numList = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);numList.stream().filter(n -> n % 2 == 0).forEach(System.out::println);// 使用reduce操作对Stream中的元素进行归约int sum = numList.stream().reduce(0, (a, b) -> a + b);System.out.println(sum);// 使用并行流处理数据int sum2 = numList.parallelStream().reduce(0, (a, b) -> a + b);System.out.println(sum2);}}

参考文献

  1. Java 8 Stream API Documentation: ​​https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html​​

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

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

相关文章

任意文件的上传和下载

1.任意文件下载&#xff08;高危&#xff09; 定义 一些网站由于业务需求&#xff0c;往往需要提供文件查看或文件下载功能&#xff0c;但若对用户查看或下载的文件不做限制&#xff0c;则恶意用户就能够查看或下载任意敏感文件&#xff0c;这就是文件查看与下载漏洞。 可以下载…

缓存更新策略

redis的缓存更新策略: 先删除缓存,在更新数据库,缺点:当线程1进行一个更新的操作,先进行缓存删除,在修改数据库,但是修改数据库之前,线程2 进行查询缓存的操作,未命中,查找数据库,写入缓存,线程1修改完成后,但是此时缓存中的数据还是旧数据,会出现数据不一致问题,只有等这个缓…

L10 数据库

1&#xff0c; 数据库的安装 sudo dpkg -i *.deb 2, 数据库命令&#xff1a; 1&#xff09;系统命令 &#xff0c; 都以.开头 .exit .quit .table 查看表 .schema 查看表的结构 2&#xff09;sql语句&…

OpenCV显示10bit Raw数据

参考&#xff1a;10 12 14bit图像存储格式&#xff0c;利用Opencv显示10bit Raw数据,并根据鼠标的移动显示对应位置的灰度值。其他bit位数的Raw数据方法类似。 代码实现&#xff1a; #include<opencv2/opencv.hpp> #include<iostream> #include<opencv/highgu…

@Valid和 @Validated

Valid 和 Validated 是用于在 Spring 框架中进行数据验证的注解。 Valid 是 Java 标准库&#xff08;javax.validation&#xff09;中的注解&#xff0c;用于标记需要进行数据验证的对象或方法参数。它可以应用于方法参数、方法返回值、字段或方法级别。当使用 Valid 注解时&a…

【Vue.js】使用Element入门搭建登入注册界面axios中GET请求与POST请求跨域问题

一&#xff0c;ElementUI是什么&#xff1f; Element UI 是一个基于 Vue.js 的桌面端组件库&#xff0c;它提供了一套丰富的 UI 组件&#xff0c;用于构建用户界面。Element UI 的目标是提供简洁、易用、美观的组件&#xff0c;同时保持灵活性和可定制性 二&#xff0c;Element…

一创聚宽的实盘就要关闭了,有没有好用的实盘平台推荐

挺多的&#xff0c;比较普遍的是QMT和Ptrade&#xff0c;python语言&#xff0c;易上手&#xff0c;通用性好&#xff0c;要说适用性可以考虑Ptrade&#xff0c;问一下你的客户经理有没有&#xff0c;用Ptrade的券商也多&#xff0c;如果之前用一创聚宽你可以无缝切换&#xff…

【工具使用】Audition软件导入.sesx文件报错问题

一&#xff0c;简介 本文主要介绍了在使用Audition导入新的wav文件后&#xff0c;保存&#xff0c;然后再打开.sesx文件时报错&#xff1a;“ 错误: 文件已损坏或使用了不受支持的格式 XML FATAL ERROR: (line: 2835, col: 69) [ D:\Project\AE_Y2311\16channel_test\16_chann…

【趣味JavaScript】5年前端开发都没有搞懂toString和valueOf这两个方法!

&#x1f680; 个人主页 极客小俊 ✍&#x1f3fb; 作者简介&#xff1a;web开发者、设计师、技术分享博主 &#x1f40b; 希望大家多多支持一下, 我们一起进步&#xff01;&#x1f604; &#x1f3c5; 如果文章对你有帮助的话&#xff0c;欢迎评论 &#x1f4ac;点赞&#x1…

linux易忘命令(如:端口、进程、文件、内存、vim)持续更新

路径&#xff1a;pwd 开放端口&#xff1a;firewall-cmd --zonepublic --add-port<端口号>/tcp --permanent 重启防火墙&#xff1a;systemctl restart firewalld 查看防火墙开放的端口&#xff1a;firewall-cmd --list-ports --permanent 解压&#xff1a; unzip *.…

基于微信小程序的语言课学习系统设计与实现(源码+lw+部署文档+讲解等)

前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f447;&#x1f3fb;…

备受以太坊基金会青睐的 Hexlink,构建亿级用户涌入 Web3的入口

早在 2021 年 9 月&#xff0c;以太坊创始人 Vitalik Buterin 就曾提出了 EIP-4337&#xff08;账户抽象&#xff09;提案&#xff0c;并在去年 10 月对该提案进一步更新&#xff0c;引发行业的进一步关注。在今年 3 月&#xff0c;EIP-4337 提案正式通过审计&#xff0c;并成为…

CPP代码检查工具

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录 系列文章目录前言CPP代码检查工具工具一:GCC编译器工具二:Cppcheck工具三:gbd调试器工具四:SonarCube嵌入式平台工具内存泄漏检查工具linux的cpu占用情况前言 认…

解决电脑桌面软件图标变白的问题

文章目录 前言一、软件图标变白的原因二、解决方法1、显示隐藏项目2、清除图标缓存 前言 桌面软件太多了&#xff0c;导致有些杂乱&#xff0c;换了个显示器后&#xff0c;想着将桌面的软件分类&#xff0c;将其放到不同的目录下&#xff0c;结果有些软件放入文件夹后图标变成…

BERT: 面向语言理解的深度双向Transformer预训练

参考视频&#xff1a; BERT 论文逐段精读【论文精读】_哔哩哔哩_bilibili 背景 BERT算是NLP里程碑式工作&#xff01;让语言模型预训练出圈&#xff01; 使用预训练模型做特征表示的时候一般有两类策略&#xff1a; 1. 基于特征 feature based &#xff08;Elmo&#xff09;…

SQLAlchemy关联表删除策略设置

目录 SQLAlchemy关联表 常用的级联选项 外键 SQLAlchemy关联表 SQLAlchemy 是一个 Python 的 ORM&#xff08;对象关系映射&#xff09;库&#xff0c;它允许你在 Python 中使用类来表示数据库中的表&#xff0c;从而更方便地进行数据库操作。在 SQLAlchemy 中&#xff0c;可…

idea没有maven工具栏解决方法

背景&#xff1a;接手的一些旧项目&#xff0c;有pom文件&#xff0c;但是用idea打开的时候&#xff0c;没有认为是maven文件&#xff0c;所以没有maven工具栏&#xff0c;不能进行重新加载pom文件中的依赖。 解决方法&#xff1a;选中pom.xml文件&#xff0c;右键 选择添加为…

SD-WAN在汽车零部件供应商中的成功案例分享

在当今数字化时代&#xff0c;企业面临着越来越多的网络挑战和瓶颈。传统网络架构已经无法满足企业高效、安全、可靠、低成本的网络需求。 SD-WAN作为一种新兴的网络方案&#xff0c;备受企业关注&#xff0c;SD-WAN在优化企业网络架构上发挥着重要的作用。 本期分享的是一家制…

香港第一金:美元指数昨晚拉高,不确定性加深金价下跌

香港第一金基本面分析&#xff1a; 中国纸黄金交易通显示&#xff0c;全球最大黄金上市交易基金(ETF)截至09月26日持仓量为876.52吨&#xff0c;较上日减持0.87吨&#xff0c;本月止净减持13.58吨。 由于美联储政策制定者对即将举行的货币政策会议继续保持鹰派立场&#xff0…

numpy的基础操作

numpy 创建:array import numpy as np anp.([[1,2,3],[4,6,2]]) anp.([[3,4,5]],dtypenp.int)#说明是int型的元素类型&#xff0c;默认是64位&#xff0c;或者可以dtypenp.float anp.zeros((3,4))#创建三行四列的零矩阵 anp.ones((3,4))dtype可以规定创建的数据类型即可创建二…