详细分析Java中Stream流和for循环的差异之处

目录

  • 前言
  • 1. 基本知识
  • 2. Demo

前言

事情起因是遍历大数据的时候,数据卡顿很严重

对于Java的基本知识推荐阅读:java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全)

1. 基本知识

在Java中,Stream API提供了一种功能强大且灵活的方式来处理集合数据

与传统的for循环相比,Stream API具有许多优势,但也存在一些差异和限制

一、Stream遍历

优势:

  • 函数式编程:Stream API提供了丰富的函数式编程操作,如map、filter、reduce等,可以更加清晰和简洁地表达数据处理逻辑
  • 并行处理:Stream API支持并行处理,可以自动利用多核处理器的优势,加速数据处理过程
  • 延迟执行:Stream操作可以延迟执行,只有在终止操作调用时才会实际执行,这有助于提高性能和资源利用率

劣势:

  • 学习曲线:相对于传统的for循环,Stream API需要一定的学习曲线,特别是对于初学者来说
  • 性能开销:在一些简单的情况下,使用Stream API可能会引入一些性能开销,特别是对于小规模数据集

应用场合:

  • 数据集合操作:对集合进行过滤、转换、排序等操作时,Stream API可以提供简洁的解决方案。
  • 大规模数据处理:对于大规模数据集合,尤其是需要并行处理的场景,Stream API可以发挥其优势。

二、For循环遍历

优势:

  • 简单直观:for循环是一种传统的迭代方式,简单直观,易于理解和掌握
  • 性能较好:在一些简单的场景下,for循环可能具有更好的性能,尤其是对于小规模数据集合

劣势:

  • 可读性较差:相比于Stream API,使用for循环可能需要更多的代码量,并且代码结构可能相对复杂,可读性较差
  • 并行处理困难:对于需要并行处理的场景,使用传统的for循环可能需要自行管理线程池等复杂逻辑

通过以上的差异之处,主要就是代码美观度以及数据量的大小来选择

影响数据量大小的因素

无论是使用Stream API还是传统的for循环,其性能在很大程度上取决于数据集合的大小
一般而言,对于小规模数据集合,两者的性能差异可能不明显,但随着数据量的增加,Stream API的优势会更加显著,尤其是在并行处理大规模数据集合时,但这个不是很绝对!!!

一切优化一定要结合自身的数据量以及对数据量的操作难易,在做出选择哪个进行迭代
一切优化一定要结合自身的数据量以及对数据量的操作难易,在做出选择哪个进行迭代
一切优化一定要结合自身的数据量以及对数据量的操作难易,在做出选择哪个进行迭代

2. Demo

基本知识Demo回顾:

import java.util.Arrays;
import java.util.List;public class Main {public static void main(String[] args) {List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);// 使用Stream API计算偶数的平方和int sumOfEvenSquaresStream = numbers.stream().filter(n -> n % 2 == 0).mapToInt(n -> n * n).sum();System.out.println("Sum of squares of even numbers using Stream: " + sumOfEvenSquaresStream);// 使用传统的for循环计算偶数的平方和int sumOfEvenSquaresForLoop = 0;for (int number : numbers) {if (number % 2 == 0) {sumOfEvenSquaresForLoop += number * number;}}System.out.println("Sum of squares of even numbers using for loop: " + sumOfEvenSquaresForLoop);}
}

以上Demo并非是比较差异,只是回顾总结,毕竟实战场合不一样,重点还是要结合自身,判断其数据迭代的快慢

观测迭代时间变化的Demo:

import java.util.ArrayList;
import java.util.List;public class Main {public static void main(String[] args) {// 创建一个包含大量数据的ListList<Integer> numbers = new ArrayList<>();for (int i = 0; i < 1000000; i++) {numbers.add(i);}// 使用Stream API进行遍历和计时long startTimeStream = System.currentTimeMillis();numbers.stream().forEach(number -> {// 在这里可以执行一些操作});long endTimeStream = System.currentTimeMillis();long elapsedTimeStream = endTimeStream - startTimeStream;System.out.println("Time taken with Stream API: " + elapsedTimeStream + " milliseconds");// 使用传统的for循环进行遍历和计时long startTimeForLoop = System.currentTimeMillis();for (int number : numbers) {// 在这里可以执行一些操作}long endTimeForLoop = System.currentTimeMillis();long elapsedTimeForLoop = endTimeForLoop - startTimeForLoop;System.out.println("Time taken with for loop: " + elapsedTimeForLoop + " milliseconds");}
}

截图如下:

在这里插入图片描述

通过上面的代码可看出,此处的处理过程使用for是比较快的!

这也后续验证了我在操作某个数据时,转为for来遍历(一定要结合自身数据以及操作):

在这里插入图片描述

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

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

相关文章

dockers拉取MySQL及Redis并挂载文件

目录 一 . MySQL拉取 1、进入 MySQL 容器内部。 2、登录 MySQL。 3、修改远程连接 4、刷新 二 . Redis拉取 1 . redis/conf中新建文件redis.conf&#xff0c;内容如下&#xff1a; 2 . 容器运行 一 . MySQL拉取 docker run -d --restartalways --name mysql \ -v /…

19 OpenCV 霍夫曼变换检测圆

文章目录 cv::HoughCircles算子参数示例 cv::HoughCircles 因为霍夫圆检测对噪声比较敏感&#xff0c;所以首先要对图像做中值滤波。 基于效率考虑&#xff0c;Opencv中实现的霍夫变换圆检测是基于图像梯度的实现&#xff0c;分为两步&#xff1a; 检测边缘&#xff0c;发现可能…

Day43-2-企业级实时复制intofy介绍及实践

Day43-2-企业级实时复制intofy介绍及实践 1. 企业级备份方案介绍1.1 利用定时方式&#xff0c;实现周期备份重要数据信息。1.2 实时数据备份方案1.3 实时复制环境准备1.4 实时复制软件介绍1.5 实时复制inotify机制介绍1.6 项目部署实施1.6.1 部署环境准备1.6.2 检查Linux系统支…

中电金信:技术实践|Flink维度表关联方案解析

导语&#xff1a;Flink是一个对有界和无界数据流进行状态计算的分布式处理引擎和框架&#xff0c;主要用来处理流式数据。它既可以处理有界的批量数据集&#xff0c;也可以处理无界的实时流数据&#xff0c;为批处理和流处理提供了统一编程模型。 维度表可以看作是用户来分析数…

JavaScript进阶:js的一些学习笔记-this指向,call,apply,bind,防抖,节流

文章目录 1. this指向1. 箭头函数 this的指向 2. 改变this的指向1. call()2. apply()3. bind() 3. 防抖和节流1. 防抖2. 节流 1. this指向 1. 箭头函数 this的指向 箭头函数默认帮我们绑定外层this的值&#xff0c;所以在箭头函数中this的值和外层的this是一样的箭头函数中的…

Spring-1

目录 概念 优点 Autowired和Resource关键字 相同点 不同点 依赖注入的三种方式 概念 Spring 是个java企业级应用的开源开发框架。Spring主要用来开发Java应用&#xff0c;但是有些扩展是针对构建J2EE&#xff08;Java平台企业版&#xff09;平台的web应用。Spring 框架目…

java-ssm-jsp-基于java的客户管理系统的设计与实现

java-ssm-jsp-基于java的客户管理系统的设计与实现 获取源码——》公主号&#xff1a;计算机专业毕设大全

自习室预订系统|基于springboot框架+ Mysql+Java+B/S架构的自习室预订系统设计与实现(可运行源码+数据库+设计文档+部署说明)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 目录 前台功能效果图 学生功能模块 管理员功能登录前台功能效果图 系统功能设计 数据库E-R图设计 lunwen参…

DirectShowPlayerService::doSetUrlSource: Unresolved error code 0x800c000d

报出这个问题&#xff0c;应该是对给的url解析不正确&#xff0c;我给的是rtsp的视频流地址&#xff0c;应该是对该格式解析异常。 所以参考两篇文&#xff1a; QT无法播放视频&#xff1a;报错&#xff1a;DirectShowPlayerService::doRender: Unresolved error code 0x8004…

OCP NVME SSD规范解读-12.Telemetry日志要求

以NVME SSD为例&#xff0c;通常大家想到的是观察SMAR-log定位异常&#xff0c;但是这个信息在多数情况下无法只能支撑完整的定位链路。 定位能力的缺失和低效是数据中心问题解决最大的障碍。 为了解决这个问题&#xff0c;Meta的做法是推进OCP组织加入延迟记录页面。同时NVME协…

练习题手撕总结

基础篇 1.基础知识&#xff08;时间复杂度、空间复杂度等&#xff09; 2.线性表&#xff08;顺序表、单链表&#xff09; 3.双链表、循环链表 4.队列 5.栈 6.递归算法 7.树、二叉树&#xff08;递归、非递归遍历&#xff09; 8.二叉搜索树&#xff08;BST&#xff09; 9.二分查…

Android Studio实现内容丰富的安卓宠物医院管理系统

获取源码请点击文章末尾QQ名片联系&#xff0c;源码不免费&#xff0c;尊重创作&#xff0c;尊重劳动 项目编号128 1.开发环境android stuido jdk1.8 eclipse mysql tomcat 2.功能介绍 安卓端&#xff1a; 1.注册登录 2.系统公告 3.宠物社区&#xff08;可发布宠物帖子&#xf…

Boyer Moore 算法介绍

1. Boyer Moore 算法介绍 Boyer Moore 算法&#xff1a;简称为 BM 算法&#xff0c;是由它的两位发明者 Robert S. Boyer 和 J Strother Moore 的名字来命名的。BM 算法是他们在 1977 年提出的高效字符串搜索算法。在实际应用中&#xff0c;比 KMP 算法要快 3~5 倍。 BM 算法思…

数据结构 之 队列(Queue)

​​​​​​​ &#x1f389;欢迎大家观看AUGENSTERN_dc的文章(o゜▽゜)o☆✨✨ &#x1f389;感谢各位读者在百忙之中抽出时间来垂阅我的文章&#xff0c;我会尽我所能向的大家分享我的知识和经验&#x1f4d6; &#x1f389;希望我们在一篇篇的文章中能够共同进步&#xff0…

JAVA爬虫系列

目录 准备工作 yml 1.入门程序&#xff08;获取到静态页面&#xff09; 2.HttpClient---Get 2.1 修改成连接池 3.HttpClient---Get带参数 3.1 修改成连接池 4.HttpClient---Post 4.1 修改成连接池 5.HttpClient---Post带参数 6.HttpClient-连接池 7.设置请求信息 …

蓝桥真题——-小蓝重组质数(全排列和质数判断)

小蓝有一个十进制正整数n&#xff0c;其不包含数码0&#xff0c;现在小蓝可以任意打乱数码的顺序&#xff0c;小蓝想知道通过打乱数码顺序,n 可以变成多少个不同的质数。 #include <iostream> #include<bits/stdc.h> using namespace std; bool isprime(int n) {if…

讯鹏Andon系统解决方案帮助工厂打造生产过程透明化

在现代制造业中&#xff0c;高效透明的生产管理模式对企业的发展至关重要。Andon系统作为一种解决方案&#xff0c;通过软硬件结合的方式&#xff0c;为企业打造了高效透明的生产管理模式&#xff0c;帮助企业实现生产过程的优化和管理的可视化。 Andon系统的软硬件结合为企业提…

swiftUI中的可变属性和封装

swiftUI的可变属性 关于swift中的属性&#xff0c;声明常量使用let &#xff0c; 声明变量使用var 如果需要在swiftUI中更改视图变化那么就需要在 var前面加上state 。 通过挂载到state列表 &#xff0c;从而让xcode找到对应的改变的值 例子&#xff1a; import SwiftUIstruc…

【兆易创新GD32H759I-EVAL开发板】图像处理加速器(IPA)的应用

GD32H7系列的IPA&#xff08;Image Pixel Accelerator&#xff09;是一个高效的图像处理硬件加速器&#xff0c;专门设计用于加速图像处理操作&#xff0c;如像素格式转换、图像旋转、缩放等。它的优势在于能够利用硬件加速来实现这些操作&#xff0c;相比于软件实现&#xff0…

BLE---Service interoperability requirements

0 Preface/Foreword references: Bluetooth core specification V5.4 definition&#xff1a;定义 declaration&#xff1a;声明 1 service definition&#xff08;服务定义&#xff09; 服务定义&#xff08;definition&#xff09;&#xff1a;必须包含服务声明(declara…