如何理解java中Stream流?

在Java中,Stream 是 Java 8 引入的一个强大API,用于处理集合(如 ListSetMap 等)数据的流式操作。它提供了一种声明式、函数式的编程风格,可以高效地进行过滤、映射、排序、聚合等操作。


Stream 的核心概念

  1. 流(Stream)
    • 流是一个来自数据源(如集合、数组、I/O 资源)的元素序列。
    • 流本身不存储数据,而是按需计算。
    • 流操作分为中间操作(Intermediate Operations)和终端操作(Terminal Operations)。
  2. 中间操作(Intermediate Operations)
    • 中间操作会返回一个新的流,可以链式调用。
    • 常见的中间操作:filter()map()sorted()distinct()limit() 等。
    • 中间操作是惰性的,只有在终端操作触发时才会执行。
  3. 终端操作(Terminal Operations)
    • 终端操作会触发流的执行,并产生一个结果或副作用。
    • 常见的终端操作:forEach()collect()reduce()count()anyMatch() 等。
    • 终端操作执行后,流会被消耗,无法再次使用。

Stream 的特点

  1. 声明式编程
    • 通过方法链描述操作,代码更简洁易读。
    • 例如:list.stream().filter(...).map(...).collect(...)
  2. 惰性求值
    • 中间操作不会立即执行,只有在终端操作触发时才会计算。
  3. 并行处理
    • 可以通过 parallelStream() 轻松实现并行处理,充分利用多核CPU。
  4. 不可复用
    • 流一旦被终端操作消费,就不能再次使用。

Stream 的常见操作

1. 创建流
List<String> list = Arrays.asList("a", "b", "c");
Stream<String> stream = list.stream(); // 从集合创建流
Stream<String> parallelStream = list.parallelStream(); // 创建并行流
Stream<Integer> numbers = Stream.of(1, 2, 3); // 直接创建流
2. 中间操作
  • 过滤filter()

    List<String> result = list.stream().filter(s -> s.startsWith("a")) // 过滤以 "a" 开头的元素.collect(Collectors.toList());
    
  • 映射map()

    List<Integer> lengths = list.stream().map(String::length) // 将字符串映射为长度.collect(Collectors.toList());
    
  • 去重distinct()

    List<String> unique = list.stream().distinct() // 去重.collect(Collectors.toList());
    
  • 排序sorted()

    List<String> sorted = list.stream().sorted() // 自然排序.collect(Collectors.toList());
    
  • 限制limit()

    List<String> firstTwo = list.stream().limit(2) // 只取前两个元素.collect(Collectors.toList());
    
3. 终端操作
  • 遍历forEach()

    list.stream().forEach(System.out::println); // 打印每个元素
    
  • 收集collect()

    List<String> result = list.stream().filter(s -> s.length() > 1).collect(Collectors.toList()); // 收集为List
    
  • 聚合reduce()

    Optional<String> combined = list.stream().reduce((s1, s2) -> s1 + "-" + s2); // 拼接字符串
    
  • 匹配anyMatch()allMatch()noneMatch()

    boolean hasA = list.stream().anyMatch(s -> s.contains("a")); // 是否有包含 "a" 的元素
    
  • 计数count()

    long count = list.stream().filter(s -> s.length() > 1).count(); // 统计符合条件的元素数量
    

并行流

通过 parallelStream() 可以轻松实现并行处理:

List<String> result = list.parallelStream().filter(s -> s.length() > 1).collect(Collectors.toList());

Stream 的优势

  1. 代码简洁:通过链式调用,代码更易读。
  2. 高效处理:支持并行处理,适合大数据量操作。
  3. 函数式编程:支持 Lambda 表达式和方法引用,更符合现代编程风格。

总结

Stream 是 Java 8 引入的一个强大工具,用于以声明式的方式处理集合数据。它通过中间操作和终端操作的组合,提供了高效、简洁的数据处理能力,特别适合需要对集合进行复杂操作的场景。

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

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

相关文章

【Vitis AIE】FPGA快速部署ConvNet 示例MNIST数据集

AIE-ML 上的 MNIST ConvNet 版本&#xff1a;Vitis 2024.2 简介 本教程在 AMD VersalTM 自适应 SoC AIE-ML 上实现了一个卷积神经网络分类器&#xff0c;用于识别来自 MNIST 数据库 的手写数字。目标是说明如何将一个简单的机器学习示例分区和向量化到 Versal AI 引擎。MNIS…

ubuntu桌面图标异常——主目录下的所有文件(如文档、下载等)全部显示在桌面

ubuntu桌面图标异常 问题现象问题根源系统级解决方案方法一:全局修改(推荐多用户环境)方法二:单用户修改(推荐个人环境)操作验证与调试避坑指南扩展知识参考文档问题现象 主目录文件异常显示 用户主目录(如/home/user/)下的所有文件(如文档、下载等)全部显示在桌面,…

OceanBase 4.3.3 AP 解析:应用 RoaringBitmaps 类型处理海量数据的判重和基数统计

对于大数据开发人员而言&#xff0c;处理海量数据的判重操作和基数统计是常见需求&#xff0c;而 RoaringBitmap类型及其相关函数是当前非常高效的一种解决方案&#xff0c;许多大数据库产品已支持RoaringBitmap类型。OceanBase 4.3.3版本&#xff0c;作为专为OLAP场景设计的正…

W25Qxx

概述 FLASH FLASH是一种是非易失性存储器&#xff0c;即掉电后不会丢失数据&#xff0c;这和RAM&#xff08;随机存储器&#xff09;不同。 FLASH比起同作用的EEPROM有价格低的优点 FLASH的擦除操作是以扇区为单位的&#xff08;比起EEPROM来说操作较为不方便&#xff09; 芯片…

(滑动窗口)算法训练篇11--力扣3.无重复字符的最长字串(难度中等)

目录 1.题目链接&#xff1a;3.无重复字符的最长字符 2.题目描述&#xff1a; 3.解法(滑动窗口)&#xff1a; 1.题目链接&#xff1a;3.无重复字符的最长字符 2.题目描述&#xff1a; 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长 子串 的长度。 示例…

深度学习1—Python基础

深度学习1—python基础 你的第一个程序 print(hello world and hello deep learning!)基本数据结构 空值 (None)&#xff1a;在 Python 中&#xff0c;None 是一个特殊的对象&#xff0c;用于表示空值或缺失的值。它不同于数字 0&#xff0c;因为 0 是一个有意义的数字&#…

记一次MyBatis分页莫名其妙的失效,首次执行合适,后续执行分页失效且异常

代码几乎一样&#xff0c;为啥这个xml配置的就会出现莫名其妙的问题呢 org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.type.TypeException: Could not set parameters for mapping: ParameterMapping{propertymybatis_plus_first, modeI…

网络不可达

导致此问题原因较多&#xff0c;我只针对一种情况进行讨论&#xff0c;如果和文中症状不同&#xff0c;另寻他处&#xff0c;或者死马当活马医&#xff08;&#xff1f;&#xff09; 如需转载&#xff0c;标记出处 症状&#xff1a; 1.ping命令网络不可达 2.ifconfig中网卡en…

【AI News | 20250322】每日AI进展

AI Repos 1、DeTikZify 可以把草图或图形转换成TikZ代码的模型&#xff0c;可用来绘制复杂的科学图表&#xff0c;输入草图或文字描述即可转换成TikZ代码。DeTikZify强大的地方在于它能理解图表的语义信息&#xff0c; 能识别图表中的不同组成部分及其含义&#xff0c;比如坐标…

Debian12生产环境配置笔记

在 Debian 12 上进行生产环境配置的详细步骤&#xff0c;涵盖软件更新、基础软件安装、Docker 及 Redis 部署&#xff0c;以及 Nginx 配置多个虚拟主机等内容。所有命令均以 root 用户身份执行&#xff0c;无需添加 sudo 1. 更新软件 首先&#xff0c;确保系统上的所有软件包…

UE AI 模型自动生成导入场景中

打开小马的weix 关注下 搜索“技术链” 回复《《动画》》 快速推送&#xff1b; 拿到就能用轻松解决&#xff01;帮忙点个关注吧&#xff01;

【最后203篇系列】022 用Deepseek14b提取新闻事件

这算是之前一直想做的一件事&#xff0c;趁周末赶快做了。 业务意义&#xff1a;现实中有大量的舆情&#xff0c;这对我们的决策会有比较重要的作用 技术依赖&#xff1a; 1 模型基础能力2 消息队列3 异步获取消息4 时间序列库 1 模型基础能力 大模型发展到现在&#xff0…

电池电量检测方法介绍,开路电压法、库仑积分法、内阻法

开路电压法、库仑积分法、内阻法、卡尔曼滤波法、混合法 开路电压法是目前最简单的方法&#xff0c;根据电池的特性得知&#xff0c;在电池容量与开路电压之间存在一定的函数关系&#xff0c;当得知开路电压时&#xff0c;可以初步估算电池的剩余电量。该方法精度不高&#xf…

微调实战 - 使用 Unsloth 微调 QwQ 32B 4bit (单卡4090)

本文参考视频教程&#xff1a;赋范课堂 – 只需20G显存&#xff0c;QwQ-32B高效微调实战&#xff01;4大微调工具精讲&#xff01;知识灌注问答风格微调&#xff0c;DeepSeek R1类推理模型微调Cot数据集创建实战打造定制大模型&#xff01; https://www.bilibili.com/video/BV1…

【Elasticsearch】基于 Word2Vec 实现文章抄袭检测

🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c=1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编程,高并发设计,Springboot和微服务,熟悉Linux,ESXI虚拟化以及云原生Docker和K8s…

多层感知机与反向传播

1. 多层感知机&#xff08;MLP&#xff09; 多层感知机是一个由多个层组成的神经网络&#xff0c;包括输入层、隐藏层和输出层。它的目标是通过学习输入数据和输出结果之间的关系&#xff0c;来解决各种问题&#xff08;比如分类或回归&#xff09;。 2. 反向传播&#xff08…

Cursor的五种高级用法

文章目录 代码编写写作编辑自动生成工作流搞定开源项目数据处理参考 代码编写 Cursor 最基本的功能是帮助你编写代码。只需使用 Composer&#xff08;CtrlI&#xff09;&#xff0c;描述你想要实现的功能&#xff0c;Cursor 就能生成相应的代码。不满意&#xff1f;直接告诉它…

LeetCode hot 100 每日一题(13)——73. 矩阵置零

这是一道难度为中等的题目&#xff0c;让我们来看看题目描述&#xff1a; 给定一个 _m_ x _n_ 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 提示&#xff1a; m matrix.lengthn matrix[0].length1 < m, n …

Java基础编程练习第34题-正则表达式

在Java里&#xff0c;正则表达式是一种强大的文本处理工具&#xff0c;它可以用于字符串的搜索、替换、分割和校验等操作。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。Java通过java.util.regex包提供了对正则表达式的支持。 以下是正则表达式在Jav…

基于基于eFish-SBC-RK3576工控板的智慧城市边缘网关

此方案充分挖掘eFish-SBC-RK3576的硬件潜力&#xff0c;可快速复制到智慧园区、交通枢纽等场景。 方案亮点 ‌接口高密度‌&#xff1a;单板集成5GWiFi多路工业接口&#xff0c;减少扩展复杂度。‌AIoT融合‌&#xff1a;边缘端完成传感器数据聚合与AI推理&#xff0c;降低云端…