详细分析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) {
        // 创建一个包含大量数据的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来遍历(一定要结合自身数据以及操作):

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu 安装 KVM 虚拟化

1. Ubuntu 安装 KVM 虚拟化 KVM 是 Linux 内核中一个基于 hypervisor 的虚拟化模块&#xff0c;它允许用户在 Linux 操作系统上创建和管理虚拟机。 如果机器的CPU不支持硬件虚拟化扩展&#xff0c;是无法使用KVM(基于内核的虚拟机)直接创建和运行虚拟机的。此时最多只能使用…

HDS-NAS分配资源并挂载win和linux

1、首先创建系统文件。 选择nas存储池 2、根据自己的需求创建相应的挂载方式 3、window配置 配置成功 最后即可在window系统网络位置映射网络即可&#xff0c; 格式为\\123.3.4.5\test 注&#xff1a;IP地址 4、liunx挂载方式 创建完成之后即可挂载&#xff0c;注意目的主…

免费开源的 Vue 拖拽组件 VueDraggablePlus (兼容移动端)

VueDraggablePlus 支持 Vue2 / Vue3&#xff0c;是被尤雨溪推荐了的拖拽组件。我自己试用过了&#xff0c;还挺好用的&#xff0c;兼容移动端。 官网&#xff1a;https://alfred-skyblue.github.io/vue-draggable-plus/ 官网文档里面很详细了&#xff0c;我就不再介绍安装和用…

包冲突解决之-invalid constant type: 18

背景 现象一&#xff1a;引入了一个包A&#xff0c;服务突然起不来了&#xff0c;后台有报错信息&#xff0c;Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type xxx available: expected at least 1 bean which quali…

【PythonCode】力扣Leetcode6~10题Python版

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

防范服务器被攻击:查询IP地址的重要性与方法

在当今数字化时代&#xff0c;服务器扮演着重要的角色&#xff0c;为企业、组织和个人提供各种网络服务。然而&#xff0c;服务器也成为了网络攻击者的目标之一&#xff0c;可能面临各种安全威胁&#xff0c;例如DDoS攻击、恶意软件攻击、数据泄露等。为了有效地防范服务器被攻…

C语言基础之结构体

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

pytorch升级打怪(三)

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

软考高级:企业应用集成概念和例题

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

内网渗透之路:常用命令助力信息深度探索

1、查询网络配置信息 ipconfig /all 2、查询操作系统及软件信息 &#xff08;1&#xff09;查询操作系统和版本信息 英文操作系统 systeminfo | findstr /B /C:"OS Name" /C:"OS Version" 中文操作系统 systeminfo | findstr /B /C:"OS 名称&q…

论文阅读:FCB-SwinV2 Transformer for Polyp Segmentation

这是对FCBFormer的改进&#xff0c;我的关于FCBFormer的论文阅读笔记&#xff1a;论文阅读FCN-Transformer Feature Fusion for PolypSegmentation-CSDN博客 1&#xff0c;整体结构 依然是一个双分支结构&#xff0c;总体结构如下&#xff1a; 其中一个是全卷积分支&#xff…

【Flutter 面试题】什么是Widget,Stateful Widget和Stateless Widget之间的区别?

【Flutter 面试题】什么是Widget&#xff0c;Stateful Widget和Stateless Widget之间的区别&#xff1f; 文章目录 写在前面解答补充说明StatelessWidget 示例StatefulWidget 示例 写在前面 &#x1f64b; 关于我 &#xff0c;小雨青年 &#x1f449; CSDN博客专家&#xff0c…

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

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

会员项目定价卡css3特效

会员项目定价卡css3特效&#xff0c;源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面 下载地址 会员项目定价卡css3特效代码

WIFI 7技术的应用前景

随着WIFI 7技术的不断成熟和普及&#xff08;如果对WIFI 7技术不太了解的&#xff0c;可以点击链接去查看一下这篇文章WIFI7&#xff1a;开启无线通信新纪元 &#xff09;&#xff0c;我们正迎来一个数字连接的全新时代。WIFI 7作为新一代无线网络标准&#xff0c;将极大的改变…

【矩阵】48. 旋转图像【中等】

旋转图像 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。你必须在 原地 旋转图像&#xff0c;这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,…

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

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

springboot276基于JS的个人云盘管理系统的设计与实现

个人云盘管理系统设计与实现 摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装个人云盘管理系统软件来发挥其…

了解常用测试模型 -- V模型、W模型

目录 V模型 测试流程 特点 优、缺点 w模型/双v模型 测试流程 特点 优、缺点 V模型 测试流程 用户需求&#xff1a;产品经理将用户需求转变为软件需求 需求分析与系统设计&#xff1a;验证需求是否正确&#xff0c;确定编程语言和框架 概要设计&#xff1a;项目结构设…

大语言模型系列-中文开源大模型

文章目录 前言一、主流开源大模型二、中文开源大模型排行榜 前言 近期&#xff0c;OpenAI 的主要竞争者 Anthropic 推出了他们的新一代大型语言模型 Claude 3&#xff0c;该系列涵盖了三个不同规模的模型&#xff1a;Opus、Sonnet 和 Haiku。 Claude 3声称已经全面超越GPT-4。…