Java Stream 如何提高遍历集合效率?

news2024/11/13 9:37:09

目录

  • 什么是 Stream?
    • Stream 如何优化遍历?
  • Stream 源码实现
    • 内部实现
    • Stream 并行处理

什么是 Stream?

Stream 的聚合操作与数据库 SQL 的聚合操作 sorted、filter、map 等类似。我们在应用层就可以高效地实现类似数据库 SQL 的聚合操作了,而在数据操作方面,Stream 不仅可以通过串行的方式实现数据操作,还可以通过并行的方式处理大批量数据,提高数据的处理效率。

一个简单的例子来体验下 Stream 的简洁与强大。
这个 Demo 的需求是过滤分组一所中学里身高在 160cm 以上的男女同学,我们先用传统的迭代方式来实现,代码如下:


Map<String, List<Student>> stuMap = new HashMap<String, List<Student>>();
        for (Student stu: studentsList) {
            if (stu.getHeight() > 160) { //如果身高大于160
                if (stuMap.get(stu.getSex()) == null) { //该性别还没分类
                    List<Student> list = new ArrayList<Student>(); //新建该性别学生的列表
                    list.add(stu);//将学生放进去列表
                    stuMap.put(stu.getSex(), list);//将列表放到map中
                } else { //该性别分类已存在
                    stuMap.get(stu.getSex()).add(stu);//该性别分类已存在,则直接放进去即可
                }
            }
        }
Map<String, List<Student>> stuMap = stuList.stream().filter((Student s) -> s.getHeight() > 160) .collect(Collectors.groupingBy(Student ::getSex)); 

Stream 如何优化遍历?

官方将 Stream 中的操作分为两大类:中间操作(Intermediate operations)和终结操作(Terminal operations)。中间操作只对操作进行了记录,即只会返回一个流,不会进行计算操作,而终结操作是实现了计算操作。

中间操作又可以分为无状态(Stateless)与有状态(Stateful)操作,前者是指元素的处理不受之前元素的影响,后者是指该操作只有拿到所有元素之后才能继续下去

终结操作又可以分为短路(Short-circuiting)与非短路(Unshort-circuiting)操作前者是指遇到某些符合条件的元素就可以得到最终结果,后者是指必须处理完所有元素才能得到最终结果。操作分类详情如下图所示:
在这里插入图片描述

Stream 源码实现

在这里插入图片描述

  • BaseStream 和 Stream 为最顶端的接口类。BaseStream 主要定义了流的基本接口方法,例如,spliterator、isParallel 等;Stream 则定义了一些流的常用操作方法,例如,map、filter 等。
  • ReferencePipeline 是一个结构类,他通过定义内部类组装了各种操作流。他定义了 Head、StatelessOp、StatefulOp 三个内部类,实现了 BaseStream 与 Stream 的接口方法。
  • Sink 接口是定义每个 Stream 操作之间关系的协议,他包含 begin()、end()、cancellationRequested()、accpt() 四个方法。ReferencePipeline 最终会将整个 Stream 流操作组装成一个调用链,而这条调用链上的各个 Stream 操作的上下关系就是通过 Sink 接口协议来定义实现的。
 
List<String> names = Arrays.asList("张三", "李四", "王老五", "李三", "刘老四", "王小二", "张四", "张五六七");

String maxLenStartWithZ = names.stream()
                  .filter(name -> name.startsWith("张"))
                  .mapToInt(String::length)
                  .max()
                  .toString();

查找出一个长度最长,并且以张为姓氏的名字

内部实现

在串行处理操作中,Stream 在执行每一步中间操作时,并不会做实际的数据操作处理,而是将这些中间操作串联起来,最终由终结操作触发,生成一个数据处理链表,通过 Java8 中的 Spliterator 迭代器进行数据处理;此时,每执行一次迭代,就对所有的无状态的中间操作进行数据处理,而对有状态的中间操作,就需要迭代处理完所有的数据,再进行处理操作;最后就是进行终结操作的数据处理。

Stream 并行处理

并行处理指的是,Stream 结合了 ForkJoin 框架,对 Stream 处理进行了分片,Splititerator 中的 estimateSize 方法会估算出分片的数据量。

ForkJoin 框架和估算算法,在这里我就不具体讲解了,如果感兴趣,你可以深入源码分析下该算法的实现。

通过预估的数据量获取最小处理单元的阈值,如果当前分片大小大于最小处理单元的阈值,就继续切分集合。每个分片将会生成一个 Sink 链表,当所有的分片操作完成后,ForkJoin 框架将会合并分片任何结果集。

在循环迭代次数较少的情况下,常规的迭代方式性能反而更好;在单核 CPU 服务器配置环境中,也是常规迭代方式更有优势;而在大数据循环迭代中,如果服务器是多核 CPU 的情况下,Stream 的并行迭代优势明显。所以我们在平时处理大数据的集合时,应该尽量考虑将应用部署在多核 CPU 环境下,并且使用 Stream 的并行迭代方式进行处理。


//使用一个容器装载100个数字,通过Stream并行处理的方式将容器中为单数的数字转移到容器parallelList
List<Integer> integerList= new ArrayList<Integer>();

for (int i = 0; i <100; i++) {
      integerList.add(i);
}

List<Integer> parallelList = new ArrayList<Integer>() ;
integerList.stream()
           .parallel()
           .filter(i->i%2==1)
           .forEach(i->parallelList.add(i));

// 像这种就需要注意:在并行操作arraylist时,需要考虑线程安全问题,当然如果是并发安全的容器的话,就不用考虑这些了

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

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

相关文章

Spring MVC 详解(连接、获取参数、返回数据)

在之前我们先简单那谈谈Spring、SpringBoot以及Spring MVC框架之间有什么关系&#xff1f;首先Spring是一个框架&#xff0c;SpringBoot脚手架是为了快速开发Spring框架而创造的技术。可以理解为SpringBoot又在Spring上面包了一层壳子&#xff0c;是基于Spring的&#xff0c;是…

xxl-job调度中心、执行器源码详解

文章目录简介调度中心一.程序启动初始化1.初始化入口类2.初始化I18n3.初始化快慢调度线程池4.初始化处理执行器注册或移除线程池更新执行器最新在线的守护线程5.初始化监控任务调度失败或执行失败的守护线程6.初始化处理执行器回调线程池监控任务执行结果丢失的守护线程7.初始化…

创建虚拟机、添加镜像以及配置虚拟机

一、创建虚拟机 1、点击 “创建新的虚拟机” 2.选择“自定义配置” 到后面可以选择硬件的类型 3.默认值就行 4.选择 “稍后安装操作系统” 5.操作系统选择 “Linux”&#xff0c;版本结合镜像自行选择 6. 虚拟机的名称自行定义&#xff0c; 就是上述显示出来的名称。 虚拟机…

Mybatis使用手册

Myabtis 官网文档 官网网站&#xff1a;https://mybatis.org/mybatis-3/zh/index.html 搭建环境 项目结构 引入依赖 创建Maven项目&#xff0c;pom依赖文件中加入mybatis和jdbc驱动依赖。 <dependency><groupId>org.mybatis</groupId><artifactId>…

CSS渐进增强方案

首先需要明确一点&#xff0c;以往浏览器对css的支持是不同的&#xff0c;不同浏览器的样式可能会存在差异&#xff0c;对待这种差异问题&#xff0c;需要写几套不同的css来兼容&#xff08;边框、圆角、颜色等&#xff09;&#xff0c;这样是非常麻烦的&#xff0c;浏览器css显…

Go项目(订单微服务)

文章目录简介handlerUTweb支付服务Notify小结简介 这部分开始梳理订单微服务的关键点这里仿京东&#xff0c;订单结算在购物车进行&#xff0c;所以用户的操作是加入商品到购物车&#xff0c;进入购物车付款从页面分析需求 点击添加到购物车&#xff0c;删除车中商品&#xff…

JAVA环境配置多环境(全,细,简单)

下载java包&#xff1a;https://www.oracle.com/java/technologies/downloads &#xff08;8版本稳定&#xff09; 直接无脑安装java程序 &#xff08;包括jdk-开发与jre-运行&#xff09; 接下来是java环境配置&#xff1a; 创建系统变量 &#xff08;用户变量也可以&#…

近红外吸收荧光染料IR-808,IR-808 NH2,IR-808 amine,发射808nm 性质分享

中文名称&#xff1a;IR-808 氨基英文名称&#xff1a;IR-808 NH2&#xff0c;IR-808 amine&#xff0c;IR-808-NH2规格标准&#xff1a;10mg&#xff0c;25mg&#xff0c;50mgCAS&#xff1a;N/A产品描述&#xff1a;IR-808&#xff0c;发射808nm&#xff0c;酯溶性染料修饰氨…

[NOIP2003 提高组] 侦探推理(C++,字符串)

题目描述 明明同学最近迷上了侦探漫画《柯南》并沉醉于推理游戏之中&#xff0c;于是他召集了一群同学玩推理游戏。游戏的内容是这样的&#xff0c;明明的同学们先商量好由其中的一个人充当罪犯&#xff08;在明明不知情的情况下&#xff09;&#xff0c;明明的任务就是找出这…

关于Ping命令的七种用法

今天我们来详细看下ping命令详细使用&#xff1a; 一、ping基本使用详解 在网络中ping是一个十分强大的TCP/IP工具。它的作用主要为&#xff1a; 1、用来检测网络的连通情况和分析网络速度 2、根据域名得到服务器IP 3、根据ping返回的TTL值来判断对方所使用的操作系统及数据…

前端——2.HTML基本结构标签

这篇文章我们从0来介绍一下HTML的相关标签内容 目录 1.HTML语法规范 1.1基本语法概述 1.2标签关系 2.HTML的基本结构标签 2.1第一个HTML网页 2.2基本结构标签总结 1.HTML语法规范 下面&#xff0c;我们来看一下HTML的语法规范的内容 1.1基本语法概述 首先&#xff0c…

基于粒子群优化支持向量机SVM发电功率回归分析,eemd-pso-svm

目录 支持向量机SVM的详细原理 SVM的定义 SVM理论 SVM应用实例,基于eemd分解+粒子群改进SVM的回归分析 代码 结果分析 展望 支持向量机SVM的详细原理 SVM的定义 支持向量机(support vector machines, SVM)是一种二分类模型,它的基本模型是定义在特征空间上的间隔最大的…

挖到宝了,这2款浏览器工具多看小说自由,没踩雷

浏览器除了可以用来搜索和工作&#xff0c;还有很多有趣的娱乐功能。例如&#xff0c;喜欢看片的朋友可以通过浏览器追剧看电影&#xff0c;小说爱好者可以通过浏览器看小说。那么&#xff0c;有没有哪些浏览器可以免费阅读小说呢&#xff1f;我挖到宝了&#xff0c;原来这2款浏…

分布式之CAP原则

文章目录一、知识储备1.1 一致性&#xff08;Consistency&#xff09;1.2 可用性&#xff08;Availability&#xff09;1.3 分区容错性&#xff08;Partition tolerance&#xff09;二、CAP原则2.1 证明三、常见分布式系统采用的原则3.1 CP原则3.2 AP原则3.3 CA原则3.4 动态调节…

可视化爬虫框架spiderflow入门及实战

官网: 点击直达官网 文档: 点击查看官网文档 以下内容部分来自官网或官网文档。文章比较长&#xff0c;请准备好瓜子和小板凳~~~ TIP&#xff1a; 文中用到的网站地址仅为了说明功能&#xff0c;如有侵犯&#xff0c;请告知&#xff0c;会及时删除或者修改本文仅供学习参考&am…

合作伙伴管理软件VS CRM,企业应该选择哪一个?

当涉及到管理你公司的伙伴关系和与客户的关系时&#xff0c;有两个主要选择&#xff1a;合作伙伴管理软件和CRM&#xff08;客户关系管理&#xff09;软件。虽然这两种工具都可以帮助你跟踪商业关系的重要信息&#xff0c;但它们都有各自的优势和不足。 合作伙伴管理软件是专门…

没有钢琴也可实现弹奏自由?实时在Jetson上运行单阶段手指关键点模型

钢琴是人类创作音乐的经典乐器&#xff0c;程序是实现创意的工具之魂。今天我给大家分享用程序实现的桌上钢琴师项目。本项目基于飞桨实现一个虚拟钢琴&#xff0c;让大家可以在任意平面上弹奏钢琴&#xff0c;实现弹奏自由。 该项目的原理是利用手部关键点检测模型识别手的关键…

金三银四,我猜你需要这套网络安全工程师面试题合集【全网首发】

以下为信息安全/网络安全各个方向涉及的面试题&#xff0c;星数越多代表问题出现的几率越大&#xff0c;祝各位都能找到满意的工作~ 注&#xff1a;做这个List的目标不是很全&#xff0c;因为无论如何都不可能覆盖所有的面试问题&#xff0c;更多的还是希望由点达面&#xff0…

h264编码之SPS解析

一、概念 SPS即Sequence Paramater Set&#xff0c;又称作序列参数集。SPS中保存了一组编码视频序列(Coded video sequence)的全局参数。 二、定义 H.264标准协议中规定的SPS格式位于文档的7.3.2.1.1&#xff0c;如下图所示&#xff1a; 1、profile_idc 根据《T-REC-H.264-2…

数据库的备份与恢复

文章目录前言备份恢复概述故障的种类数据库备份数据库的恢复日志文件前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 备份与恢复是为了防止数据库运行出现故障时造成数据丢失、损坏的一个重要手段 提示&#xff1a;以下是本篇文章正文内容&#xff0c;…