Stream流粗解

【Java】stream流 stream流可以通过简单的方式去处理一个数据集合,而不用通过冗杂的循环遍历Stream中的元素是以Optional类型存在的optional 允许元素为空。 阅读详情

Stream流粗解

  • 声明性——更简洁,更易读
  • 可复合——更灵活
  • 可并行——性能更好

案例传送门:Stream流使用案例

  • 通过对交易的各项业务查询熟悉流的使用
Map<Dish.Type, List<Dish>> dishesByType = menu.stream().collection(groupingBy(Dish::getType));

流简介

简短定义:从支持数据处理操作的源生成的元素序列。

  • 元素序列:类似于集合,流也提供了一个接口,可以访问特定元素类型的一组有序值。与集合不同,集合的主要目的是以特定的时间和空间复杂度存储和访问元素(如ArrayList和LinkedList)。流的主要目的在于表达计算。集合讲的是数据,流讲的是计算。
  • 源: 流会使用一个提供数据的源,如集合、数组或输入/输出资源。从有序集合生成流时会保留原有的顺序。由列表生成的流,其元素顺序与列表一致。
  • 数据处理操作:流的数据处理功能类似于数据库的操作,以及函数式编程语言的常用操作,如filter、map、reduce、find、match、sort等。流操作可以顺序执行,也可以并行执行
  • 流水线:很多流操作本身会返回一个流,所以多个操作就可以链起来,形成一个流水线。
  • 内部迭代:与使用迭代器显式迭代的集合不同,流的迭代操作是在背后进行的。

示例如下,结果为:[pork, beef, chicken]

List<String> threeHighCalorDishNames 
					= menu.stream() //源为menu,是一个列表,在Stream流案例中的Dish类可以看到定义
						  /**
						   * Stream<T> filter(Predicate<? super T> predicate),steam流可用的一个操作,接收一个Predicate接口对象
						   * boolean test(T t),Predicate函数式接口定义的抽象方法,签名为 T -> booean
						   * 经过filter操作(筛选卡路里高于300的)得到新流
						   */
						  .filter(d -> d.getCalories() > 300) 
						  /**
						   * <R> Stream<R> map(Function<? super T, ? extends R> mapper),steam流可用的一个操作,接收一个Function接口对象
						   * R apply(T t),Function函数式接口定义的抽象方法,签名为 T -> R
						   * 经过map操作(映射为菜名)得到新流
						   */
						  .map(Dish::getName)
						  /**
						   * Stream<T> limit(long maxSize),steam流可用的一个操作,接收一个long型整数
						   * 经过limit操作(只选择前三个)得到新流
						   */
						  .limit(3)
						  /**
						   * 返回一个list
						   */
						  .collect(Collectors.toList());

System.out.println(threeHighCalorDishNames);

流与集合

集合:是一个内存中的数据结构,它包含数据结构中目前所有的值——集合中的每个元素都得先算出来才能添加到集合中。

  • 可比喻为DVD,视频已经完全存储到了DVD中。

流:是在概念上固定的数据结构(不能添加或删除元素),其元素时按需计算的,就像一个延迟创建的集合:在按需的一步步操作完成后才创建集合。

  • 可比喻为在线流媒体,缓存一部分看一部分,按需操作。
  • 也可比喻为用浏览器进行互联网搜索,假设搜索到多条匹配项,而可以得到一个流仅展示10个,点击下一页可展示接下来的10个,每次请求都是10个。

只能遍历一次

和迭代器类似,流只能遍历一次。遍历完成后,就称这个流已经被消费掉了。如下代码:

List<String> title = Arrays.asList("Java8", "Lambda", "Steam");
Stream<String> s = title.stream();
/**
 * Stream: void forEach(Consumer<? super T> action);
 * Consumer: void accept(T t);
 */
s.forEach(System.out::println);
s.forEach(System.out::println);

结果如图:只会遍历一次,第二次遍历就抛出了异常,说明流已经被消费掉了。
在这里插入图片描述

外部迭代与内部迭代

使用Collection接口需要用户去做迭代(比如for-each),这称为外部迭代。相反,Streams库使用内部迭代——它帮你把迭代做了,还把得到的流存在了某个地方,只需要给出函数说要干什么就可以了。如下分别是集合和流的代码,说明了这种区别。

  • 集合:用for-each循环外部迭代
List<String> names = new ArrayList<>();
for (Dish d : menu) { // 显示顺序迭代菜单列表
	names.add(d.getName()); // 提取名称并将其添加到累加器
}
  • 集合:用背后的迭代器做外部迭代
List<String> names = new ArrayList<>();
Iterator<Dish> iterator = menu.iterator();
while (iterator.hasNext()) {
    Dish d = iterator.next();
    names.add(d.getName());
}
  • 流:内部迭代
List<String> names = menu.stream()
                .map(Dish::getName) // 传递行为,用getName方法参数化map,提取菜名
                .collect(Collectors.toList());
集合:外部迭代,必须一个一个处理

你:“索菲亚,我们把玩具收起来吧。地上还有玩具吗?”
索菲亚:“有,球。”
你:“好,把球放进盒子里。还有吗?”
索菲亚:“有,娃娃。”
你:“好,把娃娃放进盒子里。还有吗?”
…
索菲亚:“没了,没有了。”
你:“好,我们收完了。”

流:内部迭代,可以很好的并行处理,索菲亚可以一手球一手娃娃

你:“索菲亚,把地上的玩具都收起来。”
索菲亚:“好的。”

流操作

  • 中间操作:从源获取流开始,可以进行多个类似于filter、sorted方法等中间操作,这些操作的结果还是流。
  • 终端操作:经过一系列的中间操作后,最后使用一个终端方法,从流的流水线生成结果,该结果为其他非流的值,如List、Integer等,甚至可以是void。
  • 使用流:
    • 一个数据源(如集合)来执行一个查询;
    • 一个中间操作链,形成一条流的流水线;
    • 一个终端操作,执行流水线,并能生成结果。

使用流,具体案例点此

筛选和切片
filter

Stream接口支持filter方法,该操作接受一个谓词作为参数,并返回一个包含符合谓词的元素的流。

List<Dish> vegetarianMenu = menu.stream()
								.filter(Dish::isVegetarian)
								.collect(toList());
distinct

Stream接口支持distinct方法,该操作会返回一个元素各异的流。

List<Integer> numbers = Arrays.asList(1,2,1,3,3,2,4);
numbers.stream()
	   .filter(i -> i % 2 == 0)
	   .distinct()
	   .forEach(System.out::println);
limit

Stream接口支持limit(n)方法,该方法返回一个不超过给定长度的流。

List<Dish> dishes = menu.stream()
						.filter(d -> d.getCalories() > 300)
						.limit(3)
						.collect(toList());
skip

Stream接口支持skip(n)方法,与limit方法互补,返回一个丢掉前n元素的流。

List<Dish> dishes = menu.stream()
						.filter(d -> d.getCalories() > 300)	
						.skip(2)
						.collect(toList());	
映射

Stream接口支持map和flatMap方法,接收一个函数作为参数,这个函数会作用到流的每个元素,并将其映射成一个新的元素。

map
flatMap
查找和匹配
anyMatch
allMatch
findAny
findFirst
规约
reduce
什么是Stream流? Stream流常用的方法有哪些? 【代码】什么是Stream流?Stream流常用的方法有哪些? 阅读详情

相关推荐

软考软件评测师备考避坑指南:过来人告诉你这5个章节最容易丢分(附2024最新考纲解析)

本文为软考软件评测师考生提供备考避坑指南,深度解析5个高频失分章节,包括标准化与信息化基础、中间件技术、软件测试模型、白盒测试覆盖准则和性能测试指标。文章结合2024最新考纲,分享实战技巧和记忆口诀,帮助考生精准打击失分重灾区,提升备考效率。

weixin_29223603的博客 467

查看udp会话流

在wireshark输入: udp.stream eq 2 #查看udp流 2表示索引号

wangzhicheng2013的专栏 1422

Nuvoton OpenTitan开源安全芯片技术解析与应用

硬件安全模块(HSM)作为可信计算基的核心组件,其设计透明度和可验证性正成为行业焦点。RISC-V架构凭借开源特性,为构建可审计的安全芯片提供了新范式。OpenTitan项目通过开放Verilog源码和形式化证明,实现了从物理不可克隆函数(PUF)到分层安全启动的全栈透明。该方案在lowRISC Voyager开发板上实测显示,安全启动时间小于200ms,性能损耗仅7%,显著优于传统黑盒方案。目前该技术已应用于Chromebook和数据中心,其40nm工艺版本更将功耗降至5μA待机水平,为物联网和边缘计算提

weixin_36303807的博客 399

List Stream 常用方法

public class Student { private String name; private Integer age; private Integer math; private Integer english; //get set public Student(String name, Integer age, Integer math, Integer english) { super(); this.name = name; this.age = age; ...

ndidai的博客 5715

Amos实战:如何用Bootstrap法检验中介效应?附完整操作步骤

本文详细介绍了如何使用Amos软件通过Bootstrap法检验中介效应,包括模型设定、参数配置和结果解读。Bootstrap方法因其不依赖正态分布假设、统计功效高等优势,成为中介效应分析的首选方法。文章提供了完整的操作步骤和实用建议,帮助研究者准确评估变量间的中介作用机制。

zz67890的博客 1441

别再问ARM麒麟怎么装微信了!手把手教你用铠大师搞定Windows软件(飞腾/海思芯片实测)

本文详细介绍了如何在ARM架构的信创电脑(如飞腾/海思芯片)上使用铠大师安装和运行Windows软件,解决微信、Office等常用软件的兼容性问题。通过实测数据对比,铠大师在性能和易用性上显著优于传统方案,为麒麟系统用户提供了一套完整的解决方案。

weixin_28736355的博客 894

Java项目中常用的Stream流

【代码】Java项目中常用的Stream流。

weixin_67573348的博客 200

【模拟IC】从VCD到VEC:Cadence数模混合仿真中高效激励转换与HSIM工具链实战

本文详细解析了在Cadence数模混合仿真中,如何利用HSIM工具链的vcd2vec命令,将数字仿真生成的VCD文件高效转换为模拟仿真器所需的VEC格式激励文件。文章提供了从VCD文件预处理、io_top.sig文件编写、核心命令参数详解到Cadence ADE环境集成验证的全链路实战指南,并分享了自动化脚本方案,旨在解决数模混合验证中的“语言不通”难题,提升仿真效率。

k9l0m1的博客 121

Java stream流处理常用操作

【代码】Java stream流处理常用操作。

weixin_41866717的博客 333

接口电路设计的关键要点

接口电路设计是嵌入式硬件开发的核心环节,本文系统阐述了五大关键设计要点:1)电平匹配技术,详细分析了3.3V/5V系统互连方案及转换电路计算;2)阻抗匹配原理,包括高速信号反射机制及差分信号处理;3)滤波与去耦设计,提出多级电容配置和"先电容后过孔"布局原则;4)接地设计规范,重点说明模拟/数字地分离及高速信号回流路径;5)防护电路设计,涵盖防反接、过流保护及ESD防护方案。文章通过具体计算公式、器件选型指南和布局技巧,为接口电路设计提供了系统化的解决方案,并附有设计检查清单和典型问题分

weiyvyy的博客 454

Unity 编辑器篇|(四)编辑器拓展GUI类 (全面总结 | 建议收藏)

GUI 类是 Unity GUI 的接口,并且具有手动定位功能。“即时模式”GUI 系统(也称为 IMGUI)是一个完全独立的功能系统,不同于 Unity 基于游戏对象的主 UI 系统。IMGUI 是一个代码驱动的 GUI 系统,主要用作程序员的工具。为了驱动该系统,需在实现脚本上调用 OnGUI 函数即时模式 GUI 系统常用于:创建游戏内调试显示和工具。为脚本组件创建自定义检视面板。创建新的编辑器窗口和工具以扩展 Unity 本身。

游戏开发小Y的博客 12万+

js 判断字符串为空和不为空(两种方法)

1 判断字符串为空 (1)第一种方法 var test=""; if(test==""||test==null||test==undefined){ alert("为空"); } (2)第二种方法 var test=""; if(!test){ alert("为空"); } 2 判断字符串不为空 (1)第一种方法 var test=""; if(test==""||test==null||test==undefined){ alert("为空"); } .

旭东怪的博客 7万+

Openclaw错误排查及解决方案之:Something went wrong while processing your request. Please try again.

Openclaw错误排查及解决方案之:Something went wrong while processing your request. Please try again.

多媒体编程、网络编程、系统编程、网络安全编程、驱动编程 3788

stream流详解

Stream流 一 :Stream流的介绍 stream不存储数据,而是按照特定的规则对数据进行计算,一般会输出结果; stream不会改变数据源,通常情况下会产生一个新的集合; stream具有延迟执行特性,只有调用终端操作时,中间操作才会执行。 对stream操作分为终端操作和中间操作,那么这两者分别代表什么呢? 终端操作:会消费流,这种操作会产生一个结果的,如果一个流被消费过了,那它就不能被重用的。 中间操作:中间操作会产生另一个流。因此中间操作可以用来创建执行一系列动作的管道。一个特别需要注意的点

weixin_45785893的博客 2万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Stream流知识总结

本文讲述了Java Stream流的运用

更新学习日常,欢迎交流~ 2765

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Stream流

filter过滤,limit获取前几个元素,skip跳过前几个元素,distinct 元素去重,依赖(hashcode和equal法),concat(Stream a, Stream b) 合并a和b两个流为一个流,map转换流中的数据类型,forEach遍历,count()统计,toArray() 收集流中的数据放到数组中,collect(Collector collector)收集流中的数据,放到集合中(list,set,map),过滤奇数,只留下偶数。并将结果保存起来,将结果收集到Map集合中

m0_46702681的博客 2829

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

【Stream流】

案例需求按照下面的要求完成集合的创建和遍历原始方式示例代码使用Stream流示例代码Stream流的好处。

睿的博客 1442

初识Stream流

初始Stream流及其方法解析

用笔锋去记录技术,去分享知识 2193

集合框架——stream流

博主计划使用优快云来记录Java后端开发的学习经历,并分享自己的编程心得和知识,期望能为那些有需求的朋友提供帮助。博主也期望能与那些持续努力学习的朋友们共同进步!编程之路是一条充满艰辛与挑战的路,需要我们付出更多的心血,才能走得更远。只有通过不懈的研究和深入的思考,以及勤于实践,我们才能在编程的道路上取得真正的成就刚刚我们了解到去重的原理是基于比较equals和比较元素的哈希值进行去重的,所以,我们自定义类型必须要重写equals方法和hashCode方法,否则不能去重准备数据。

weixin_49785524的博客 2199

Java的Stream流

是专业用于对集合或者数组进行便捷操作的

weixin_50921885的博客 1265

Stream流操作

IO: output: input流:像水流一样传输数据。

pengxiang1998的博客 1742

Java—Stream流

本文详细介绍了JAVA中有关Stream的相关内容。

向上的咸鱼blueblue的博客 1785

Java Stream流详解

Stream流是Java 8引入的一种处理数据集合的API,它允许以声明式方式处理数据集合,让开发者能够写出更加简洁、高效的代码。Stream流的设计初衷是提供一种函数式编程的方式来处理集合,使代码更具可读性,并可以利用多核架构实现并行操作。Stream流不是一种数据结构,它只是数据源的一个视图,不会存储数据,也不会修改源数据。通常,Stream流的操作是延迟执行的,这意味着它们直到需要结果时才会计算。

yk_dflkg的博客 2420

带你了解Stream流

Java8的两个重大改变,一个是Lambda表达式,另一个就是本Stream API表达式。Stream是Java8中处理集合的关键抽象概念,它可以对集合进行非常复杂的查找、过滤、筛选等操作。

qq_63839698的博客 1428
上一篇: Stream流案例
某Java小白
博客等级 码龄7年 0粉丝 4原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值