java中,stream的filter和list的removeIf筛选速度比较

在 Java 里,Stream 的filter和 List 的removeIf筛选效率要依据具体情形来判断。

1. 操作本质有别

  • Stream 的 filter
    • 它是一种中间操作,不会立刻执行,而是把筛选条件记录下来。只有遇到终端操作时,才会开始处理元素。
    • 此操作不会对原集合进行修改,而是生成一个新的流。
  • List 的 removeIf
    • 这是一种终端操作,会立即对原集合进行修改,删除满足条件的元素。
    • 它直接在原集合上进行元素的删除操作。

2. 效率对比分情况

  • 单次筛选场景
    当你只需要对集合进行一次筛选时,removeIf的效率更高。这是因为它直接在原集合上进行操作,避免了创建新的流和中间集合。
  • 链式操作场景
    如果需要进行多次筛选或者其他中间操作,Stream 的filter会更高效。因为 Stream 采用延迟执行策略,能将多个操作进行优化合并,减少遍历次数。

3. 示例与性能测试

下面通过代码来直观感受两者的性能差异:

java

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;public class FilterVsRemoveIf {public static void main(String[] args) {// 创建一个包含大量元素的列表List<Integer> list = new ArrayList<>();for (int i = 0; i < 1000000; i++) {list.add(i);}// 测试Stream的filterlong startTime = System.currentTimeMillis();List<Integer> filteredList = list.stream().filter(e -> e % 2 == 0).collect(Collectors.toList());long endTime = System.currentTimeMillis();System.out.println("Stream filter耗时: " + (endTime - startTime) + "ms");// 重新创建相同的列表用于测试removeIflist = new ArrayList<>();for (int i = 0; i < 1000000; i++) {list.add(i);}// 测试List的removeIfstartTime = System.currentTimeMillis();list.removeIf(e -> e % 2 != 0);endTime = System.currentTimeMillis();System.out.println("List removeIf耗时: " + (endTime - startTime) + "ms");}
}

测试结果分析

  • Stream 的 filter:由于要创建流、中间集合以及进行终端操作,会带来一些额外的开销。
  • List 的 removeIf:直接在原集合上进行操作,无需创建新的集合,所以速度更快。

4. 如何选择

  • 选择 Stream 的 filter 的情况
    • 你不想对原集合进行修改。
    • 需要进行链式操作,比如多次筛选、映射等。
    • 希望代码更加简洁易读。
  • 选择 List 的 removeIf 的情况
    • 你想直接修改原集合。
    • 只需要进行一次筛选操作。
    • 追求更高的性能。

综上所述,在单次筛选且需要修改原集合时,removeIf是更好的选择;而在需要链式操作或者保留原集合的场景下,filter更为合适。结合本人使用心得,当你使用当前处理器与其他处理器公用一个传入变量时,使用流式处理,不要操作原对象;仅有当前处理器时,建议使用list自有方法,因为它速度更快。

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

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

相关文章

Python(28)Python循环语句指南:从语法糖到CPython字节码的底层探秘

目录 引言一、推导式家族全解析1.1 基础语法对比1.2 性能对比测试 二、CPython实现揭秘2.1 字节码层面的秘密2.2 临时变量机制 三、高级特性实现3.1 嵌套推导式优化3.2 条件表达式处理 四、性能优化指南4.1 内存使用对比4.2 执行时间优化技巧 五、最佳实践建议六、总结&#x1…

深度分析:Microsoft .NET Framework System.Random 的 C++ 复刻实现

深度分析&#xff1a;Microsoft .NET Framework Random 的 C 复刻实现 核心原理与算法结构 本实现基于 Knuth 减随机数生成器&#xff08;Subtractive Random Number Generator&#xff09;&#xff0c;是 .NET Framework 中 System.Random 的精确复刻。其核心特点包括&#x…

[论文阅读] 人工智能 | 在非CUDA硬件上运行几何学习:基于Intel Gaudi-v2 HPU的PyTorch框架移植实践

在非CUDA硬件上运行几何学习&#xff1a;基于Intel Gaudi-v2 HPU的PyTorch框架移植实践 论文标题&#xff1a;PyTorch-based Geometric Learning with Non-CUDA Processing Units: Experiences from Intel Gaudi-v2 HPUs arXiv:2507.01031 (cross-list from cs.LG) PyTorch-ba…

Python-多线程-threading

1 需求 2 接口 3 示例 4 参考资料 Python treading 模块 | 菜鸟教程

2025年- H91-Lc199-- 62.不同路径(多维动态规划)--Java版

1.题目描述 2.思路 dp含义&#xff1a;代表到当前位置的路径数 递推公式&#xff1a;dp[i][j]dp[i-1][j]dp[i][j-1] dp数组初始化&#xff0c;我们要确保第一行和第一列是有值的. dp数组的遍历顺序&#xff1a;我们需要从左往右遍历&#xff0c;从上往下遍历。并且把第一行和第…

char 不是 Java 中的 2 字节(16 位)吗? 为什么用 UTF-8 编码写入时,一个中文要占 3 个字节?

char 不是 Java 中的 2 字节&#xff08;16 位&#xff09;吗&#xff1f; 为什么用 UTF-8 编码写入时&#xff0c;一个中文要占 3 个字节&#xff1f; ✅ 一、Java 中的 char 是什么&#xff1f; Java 的 char 是一个 固定大小的 2 字节&#xff08;16 位&#xff09;类型&am…

【Elasticsearch】检索排序 分页

检索排序 & 分页 1.测试数据准备2.排序功能2.1 简单字段排序2.2 多字段排序2.3 日期排序 3.分页功能3.1 基础分页3.2 深度分页&#xff08;不推荐大数据量使用&#xff09;3.3 使用 search_after 进行高效分页 4.综合示例&#xff1a;高亮排序分页5.实践建议 1.测试数据准备…

Delta、Jackknife、Bootstrap

用班级平均身高的案例&#xff0c;展示 ​Delta、Jackknife、Bootstrap​ 的完整计算过程。 ​0. 数据准备​ ​原始数据&#xff08;4个学生的身高&#xff09;​​&#xff1a; 真实均值&#xff08;目标统计量&#xff09;​​&#xff1a; ​1. Delta 方法&#xff08;公式…

企业智脑技术架构设计:紧贴企业场景规划面向未来的发展趋势与实现路径

摘要 本文深入探讨了企业智脑技术架构的设计理念与发展趋势&#xff0c;分析了当前企业智能化转型的技术需求与挑战&#xff0c;提出了一个面向未来的企业智脑技术架构设计方案。文章从底层技术支撑、核心能力构建、应用场景适配、安全合规保障以及未来发展路径五个维度展开论…

新手向:Python方向讲解

从NASA火星任务到TikTok推荐算法&#xff0c;从自动化脚本到量子计算&#xff0c;Python用import antigravity重新定义了编程边界 一、设计哲学&#xff1a;优雅明确的编程禅学 Python之禅&#xff08;import this&#xff09;&#xff1a; 优美胜于丑陋&#xff08;Beautifu…

Chrome谷歌浏览器插件ModHeader,修改请求头,开发神器

文章目录一、介绍与下载二、使用一、介绍与下载 ModHeader顾名思义就是让我们可以自定义HTTP请求头或者是重写响应头&#xff0c;包括新增请求头/响应头或者覆盖Chrome浏览器设置的请求头的默认值&#xff0c;同时还可以根据URL Pattern来只对特定网站生效。 有条件的同学可以…

SEW:无监督预训练在语音识别中的性能-效率权衡

摘要 本文研究了自动语音识别&#xff08;ASR&#xff09;中预训练模型的性能-效率权衡问题。我们聚焦于 wav2vec 2.0&#xff0c;并形式化了多种影响模型性能和效率的架构设计。基于所有观察结果&#xff0c;我们提出了 SEW&#xff08;Squeezed and Efficient Wav2vec&#…

linux系统部署express+vue项目

一、准备阶段&#xff1a; 1、安装linux上所需要的环境&#xff1a;npm nodejs nginx pm2 //安装 npm&#xff08;Node 包管理器&#xff09; sudo apt install npm//判断是否安装成功 npm -v//安装 Node.js&#xff08;可以根据需要选择版本&#xff09; sudo apt inst…

PixiJS教程(004):点击事件交互

1.6 事件交互实现要求&#xff1a;点击宝剑&#xff0c;修改宝剑的颜色。1️⃣实现代码&#xff1a; // 为精灵添加交互事件 sprite.interactive true; sprite.on(click, () > {// 点击精灵时&#xff0c;改变精灵的颜色sprite.tint Math.random() * 0xFFFFFF; });说明&am…

创客匠人助力家庭教育IP破局:从0到1打造创始人个人品牌全攻略

一、IP定位&#xff1a;细分赛道的精准锚定与用户画像构建 在家庭教育8000亿市场规模的竞争中&#xff0c;创始人IP的差异化定位成为破局关键。创客匠人通过“标签化定位”工具&#xff0c;帮助教育者锁定垂直领域&#xff0c;如亲子沟通、青春期教育等细分赛道。以景丽霞老师…

使用坚果云扩容Zotero同步空间的简单快捷方法

本文介绍基于坚果云的WebDAV协议&#xff0c;用于文献管理软件Zotero的文件同步&#xff0c;从而实现Zotero存储空间扩容的方法。 在之前的文章Zotero文献管理软件入门使用方法&#xff1a;软件下载、文献导入、引文插入&#xff08;https://blog.csdn.net/zhebushibiaoshifu/a…

Java启动脚本

Java启动脚本 编写代码&#xff0c;然后打包 Java-1.0-SNAPSHOT.jar public class test {public static void main(String[] args) {System.out.println("Hello IDEA");} }编写运行脚本 #!/bin/sh WORKDIR$(cd $(dirname $0); pwd) cd $WORKDIRexport JAVA_OPTS"…

VSCode使用ssh远程连接阿里云

1. 终端选择 Windows使用PowerShell Ubuntu和Mac使用Terminal 2. 设置ssh 2.1. 第一台电脑 生成密钥 ssh-keygen -o -t rsa -b 4096 -C "emailexample.com" 按三次回车 查看密钥 cat ~/.ssh/id_rsa.pub 拷贝密钥&#xff0c;粘贴到服务器的密钥框中 2.2. 第…

XLSR-Wav2Vec2:用于语音识别的无监督跨语言表示学习

摘要 本文提出了 XLSR&#xff0c;该方法通过从多种语言的原始语音波形中预训练单个模型&#xff0c;以学习跨语言的语音表示。我们基于 wav2vec 2.0 构建模型&#xff0c;该方法通过对掩蔽后的潜在语音表示解决对比任务进行训练&#xff0c;并联合学习在多种语言之间共享的潜…

图灵完备之路(数电学习三分钟)----数据选择器与总线

1.数据选择器之前我们学习了逻辑与算数的计算&#xff0c;得知两个数字之间的加减和与或的结果是不同的&#xff0c;而一个通用的数字电路不可能只有一个功能&#xff0c;所以我们将在本节引入电路选择器这一“器件”&#xff0c;来实现对两个输入的运算方式的选择&#xff0c;…