详细分析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.hqwc.cn/news/542550.html

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

相关文章

【PythonCode】力扣Leetcode6~10题Python版

【PythonCode】力扣Leetcode6~10题Python版 前言 力扣Leetcode是一个集学习、刷题、竞赛等功能于一体的编程学习平台&#xff0c;很多计算机相关专业的学生、编程自学者、IT从业者在上面学习和刷题。 在Leetcode上刷题&#xff0c;可以选择各种主流的编程语言&#xff0c;如C、…

Backend - Windows 自动排程

目录 一、创建排程 1. Windows 键 R 打开"运行"。输入taskschd.msc 回车&#xff0c;进入工作排程器。 2. 在右侧“动作”导航栏中&#xff0c;点击“建立工作”。 3. 设置“一般”、“触发程序”、“动作”。 4. 排程管理 二、运行问题 1. 文件位置相关问题…

软考高级:BPR 和 BPM概念和例题

作者&#xff1a;明明如月学长&#xff0c; CSDN 博客专家&#xff0c;大厂高级 Java 工程师&#xff0c;《性能优化方法论》作者、《解锁大厂思维&#xff1a;剖析《阿里巴巴Java开发手册》》、《再学经典&#xff1a;《Effective Java》独家解析》专栏作者。 热门文章推荐&am…

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

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

【AI+应用】一步步搭建聊天机器人搭配多种国内外大模型以及api接口调用

如果你看过我之前写的一篇文章 【AI应用】怎么快速制作一个类chatGPT套壳网站&#xff0c; 你可能顺利地使用chatGPT、Gemini&#xff0c; 用得很happy。 突然有一天&#xff0c;你发现一些网站&#xff0c;除了chatGPT、Gemini &#xff0c;还可以切换使用国内外其他的大模型…

你为什么是你,而不是别人?认识人格的力量

你为什么是你&#xff0c;而不是别人&#xff1f;让你做自我介绍&#xff0c;你会怎么描述自己呢&#xff1f; 人格心理学是心理学的一门重要分支学科。探求、描述和揭示个体思想、情绪及行为的独特模式&#xff0c;综合个人与环境诸多影响因素&#xff0c;对现实社会中的个人作…

鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:ColumnSplit)

将子组件纵向布局&#xff0c;并在每个子组件之间插入一根横向的分割线。 说明&#xff1a; 该组件从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 可以包含子组件。 ColumnSplit通过分割线限制子组件的高度。初始…

电视盒子解析安装包失败,安卓4.4安装不了kodi的解决方法,如何安装kodi

有些安卓电视或者电视盒子的安卓系统版本太低、自身架构或者屏蔽了安装其他应用的功能&#xff0c;下载的Kodi apk安装包提示无法安装&#xff0c;解析程序包时出现问题、解析出错无法安装、[INSTALL_FAILED_OLDER_SDK]、此应用与您的电视不兼容。 解决方法&#xff1a; 1、3…

linux下重启ORACLE

切换到oracle用户 su - oracle 登录oracle sqlplus / as sysdba 启动数据库 startup 退出数据库 exit 启动监听 lsnrctl start FINISH

【Java设计模式】二十三、解释器模式

文章目录 1、解释器模式2、案例 1、解释器模式 计算一个表达式的值&#xff0c;比如12-34-7&#xff0c;单纯的定义方法或函数很难适配所有&#xff0c;因为数值和运算符可以有无数种组合。 //用于n个整数相加 public static int add(Integer ... arr) {int sum 0;for (Inte…

Xpay源支付2.8.8免授权聚合免签系统

产品介绍 XPay是专为个人站长打造的聚合免签系统&#xff0c;拥有卓越的性能和丰富的功能。采用全新轻量化的界面UI&#xff0c;让您可以更加方便快捷地解决知识付费和运营赞助的难题。同时&#xff0c;它基于高性能的ThinkPHP 6.1.2 Layui 2.8.10 PearAdmin架构&#xff0c…

Learn OpenGL 08 颜色+基础光照+材质+光照贴图

我们在现实生活中看到某一物体的颜色并不是这个物体真正拥有的颜色&#xff0c;而是它所反射的(Reflected)颜色。物体的颜色为物体从一个光源反射各个颜色分量的大小。 创建光照场景 首先需要创建一个光源&#xff0c;因为我们以及有一个立方体数据&#xff0c;我们只需要进行…