Java流Stream学习(1)

举报
幼儿园老大* 发表于 2024/09/19 11:19:13 2024/09/19
【摘要】 基础概念流流处理是对运动中的数据的处理,在生成或接收数据时直接计算数据。应用程序中分析和查询不断存在,数据不断地流经它们。在从流中接收到事件时,流处理应用程序对该事件作出反应。如果我们使用传统的循环迭代方式对数据集进行复杂计算,常常会带来两个弊端:迭代次数多,迭代次数跟函数调用的次数相等。频繁产生中间结果,存储开销无法接受。流处理可以立即对事件做出反应,且可以处理比其他数据处理系统大得多的数...

基础概念

流处理是对运动中的数据的处理,在生成或接收数据时直接计算数据。应用程序中分析和查询不断存在,数据不断地流经它们。在从流中接收到事件时,流处理应用程序对该事件作出反应。

如果我们使用传统的循环迭代方式对数据集进行复杂计算,常常会带来两个弊端:

  1. 迭代次数多,迭代次数跟函数调用的次数相等。
  2. 频繁产生中间结果,存储开销无法接受。

流处理可以立即对事件做出反应,且可以处理比其他数据处理系统大得多的数据量:直接处理事件流,并且只保留数据中有意义的子集。尤其是面对持续生成,本质上是无穷尽的数据集。

Java Stream 类

JDK 1.8 新增。将要处理的元素集合看作一种流,在管道的节点上进行处理。使代码更简洁易读。

集合接口有两个方法来生成流,数据类型将由 Collection 转化为 Stream 。

  • stream 方法:为集合创建串行流。
  • parallelStream 方法:为集合创建并行流。
  1. Stream 的遍历方式和结果与 Iterator 无差别(便于转化),其优势在于其原型链的设计使得它可以对遍历处理后的数据进行再处理。

  2. parallelStream 提供了流的并行处理,底层使用 Fork/Join 框架,简单理解就是多线程异步任务的一种实现。处理过程中会有多个线程处理元素,具体由 JDK 负责管理。不保证有序性。

  3. 串行流和并行流之间可以通过 parallel  sequential 方法相互转化。

Stream<Integer> stream = list.stream();                     // 声明作为流处理
ParellerStream<Integer> pStream = stream.parallel();        // 转化为并行流Copy to clipboardErrorCopied

流操作

流处理的每个操作阶段都会封装到一个 Sink 接口里,处理数据后再将数据传递给下游的 Sink。

Stream 上的所有操作分为两类:中间操作和结束操作。Stream 是延迟执行的,只有调用到结束操作,才触发整个流水线的执行。如果未定义结束操作,那么流处理什么也不会做。

// 获取空字符串的数量
int count = strings.parallelStream()                       // 声明作为流处理
                   .filter(string -> string.isEmpty())     // 中间操作,过滤空元素
                   .count();                               // 结束操作,计数
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。