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

news2025/1/8 5:20:47

目录

  • 前言
  • 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) {
        // 创建一个包含大量数据的List
        List<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.coloradmin.cn/o/1520541.html

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

相关文章

对模型性能进行评估(Machine Learning 研习十五)

在上一篇我们已然训练了一个用于对数字图像识别的模型&#xff0c;但我们目前还不知道该模型在识别数字图像效率如何&#xff1f;所以&#xff0c;本文将对该模型进行评估。 使用交叉验证衡量准确性 评估模型的一个好方法是使用交叉验证&#xff0c;让我们使用cross_val_score…

emment语法

文章目录 1. 生成普通的标签2. 生成 div类名3. 生成指定标签类名/id 值4. 生成带有子元素的标签5. 生成内部文本6. 一次可以生成多个标签7. 生成带有指定属性 的元素8. 生成相邻兄弟元素 1. 生成普通的标签 本质使用的就是元素选择器&#xff0c;例如 div p a 标签等等。 2. …

绝地求生:PUBG 2024年 更新重点偏向于武器平衡、游戏互动及联名道具

一、游戏体验 1. 增加可破坏的环境 1.1 增加更多互动功能 通过可破坏环境将游戏方式变得千变万化。待功能上线&#xff0c;在后续游戏中玩家可以对建筑物进行部分破坏来开辟新的进攻、撤退路线&#xff0c;或搭建掩体进行战略性攻击。 环境破坏部分功能&#xff0c;将会在4…

uniapp无感登录封装

全局请求封装 https://blog.csdn.net/qq_42618566/article/details/109308690 无感登录封装 import {http} from "./index.js" let requestsQueue []; // 请求队列// 记录请求队列 export function recordRequests(path, params, loading, method) {requestsQueu…

SQLiteC/C++接口详细介绍之sqlite3类(四)

快速跳转文章列表&#xff1a;SQLite—系列文章目录 上一篇&#xff1a;SQLiteC/C接口详细介绍之sqlite3类&#xff08;三&#xff09; 下一篇&#xff1a;SQLiteC/C接口详细介绍之sqlite3类&#xff08;五&#xff09; 编写不易&#xff0c;有用的朋友点个赞或加粉一下万分感…

详解命令docker run -d --name container_name -e TZ=Asia/Shanghai your_image

docker run 是Docker的主要命令&#xff0c;用于从镜像启动一个新的容器。下面详细解释并举例说明 -d, --name, -e TZ 参数的用法&#xff1a; -d 或 --detach&#xff1a; 这个标志告诉Docker以守护进程&#xff08;后台&#xff09;模式运行容器。这意味着当你执行 docker ru…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《适应分布式资源渗透率提高的配电网网元规划方法》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:TextArea)

多行文本输入框组件&#xff0c;当输入的文本内容超过组件宽度时会自动换行显示。 高度未设置时&#xff0c;组件无默认高度&#xff0c;自适应内容高度。宽度未设置时&#xff0c;默认撑满最大宽度。 说明&#xff1a; 该组件从API Version 7开始支持。后续版本如有新增内容&…

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

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

【spring】@PropertySource 注解学习

PropertySource介绍 PropertySource是Spring框架中的一个注解&#xff0c;主要用于Java配置类中&#xff0c;用于引入额外的属性文件&#xff0c;以便在Spring应用上下文中使用这些属性。 在Spring 3.1引入Java配置后&#xff0c;我们可以通过Configuration注解的类和Bean注解…

数据结构之链式二叉树

当我们初步了解二叉树后 我们就可以进一步去深入学习二叉树了 1.链式二叉树的遍历 这里我们先去定义链式二叉树的结构 分为两个指针 一左一右 他们分别指向左子树和右子树 typedef int BTDataType;typedef struct BinaryTreeNode {BTDataType data;struct BinartTreeNod…

气液分离器的选型介绍

气液分离器在热泵或制冷系统中的基本作用是分离出并保存回气管里的液体以防止压缩机液击。因此,它可以暂时储存多余的制冷剂液体,并且也防止了多余制冷剂流到压缩机曲轴箱造成油的稀释。因为在分离过程中,冷冻油也会被分离出来并积存在底部,所以在气液分离器出口管和底部会…

Mybatis的简介和实现增删改查

第一章&#xff1a;框架的概述 JDBC存在的问题 我们要想研究mybatis就必须知道jdbc所存在的问题&#xff0c;那我那么我们首先来复习一下jdbc操作数据库的大致流程。 1.加载数据库驱动 2.创建并获取数据库连接对象connection 3.通过连接对象获取会话对象statement 4.编写sql…

Docker 系列2【docker安装mysql】【开启远程连接】

文章目录 前言开始步骤1.增加mysql挂载目录2.下载镜像2.启动容器具体步骤4.无法连接5.测试连接 总结 前言 本文开始&#xff0c;默认已经安装docker&#xff0c;如果你还没有完成这个步骤&#xff0c;请查看这一篇文章【docker安装与使用】 开始步骤 1.增加mysql挂载目录 m…

考研模拟面试-答案【攻略】

考研模拟面试-答案【攻略】 前言版权推荐考研模拟面试-答案前面的问题通用问题专业题数据结构计算机网络操作系统数据库网络安全 手写题数据结构操作系统计算机网络 代码题基础代码题其他代码题 后面的问题补充题目 基础代码题答案链栈循环队列1循环队列2哈希表 最后 前言 202…

pytorch升级打怪(三)

数据集合数据加载器 简介加载数据集迭代和可视化数据集为您的文件创建自定义数据集__init____len____getitem__ 准备您的数据以使用DataLoaders进行训练通过DataLoader进行遍载 简介 处理数据样本的代码可能会变得混乱且难以维护&#xff1b;理想情况下&#xff0c;我们希望我…

C++笔记:从零开始一步步手撕高阶数据结构AVL树

文章目录 高度平衡二叉搜索树实现一颗AVL树结点与树的描述——定义类AVL树的插入操作步骤1&#xff1a;按照二叉搜索树的方法插入结点步骤2&#xff1a;自底向上调整平衡因子步骤3&#xff1a;触发旋转操作&#xff08;AVL树平衡的精髓&#xff09;右单旋左单旋左右双旋右左双旋…

AtomoVideo:AIGC赋能下的电商视频动效生成

✍&#x1f3fb; 本文作者&#xff1a;凌潼、依竹、桅桔、逾溪 1. 概述 当今电商领域&#xff0c;内容营销的形式正日趋多样化&#xff0c;视频内容以其生动鲜明的视觉体验和迅捷高效的信息传播能力&#xff0c;为商家创造了新的机遇。消费者对视频内容的偏好驱动了视频创意供给…

C语言基础之结构体

文章目录 一、结构体1、结构体概述2、结构体类型的定义方式&#xff08;1&#xff09;先定义结构体类型&#xff0c;再定义结构体变量&#xff08;2&#xff09;结构体类型、变量同时定义&#xff08;3&#xff09;一次性结构体 3、结构体成员的初始化(1)结构体初始化(2)清空结…

linux用git拉取我云端以及git处理冲突

拉取后切换一个跟云端分支(dev)一样的 git branch --set-upstream-toorigin/dev dev 之后就同步了 A在dev分支写了iii,提交 B在dev分支写了hhh,提交,冲突 怎么修改,B把云端的拉下来,随便改改就行