24.Stream流

news2024/11/18 19:55:39

Stream流

一、什么是Stream流

Stream流操作是Java 8提供一个重要新特性,它允许开发人员以声明性方式处理集合,其核心类库主要改进了对集合类的 API和新增Stream操作。Stream类中每一个方法都对应集合上的一种操作。将真正的函数式编程引入到Java中,能 让代码更加简洁,极大地简化了集合的处理操作,提高了开发的效率和生产力。
同时stream不是一种数据结构,它只是某种数据源的一个视图,数据源可以是一个数组,Java容器或I/O channel等。在Stream中的操作每一次都会产生新的流,内部不会像普通集合操作一样立刻获取值,而是 惰性取值 ,只有等到用户真正需要结果的时候才会执行。 并且对于现在调用的方法,本身都是一种高层次构件,与线程模型无关。因此在并行使用中,开发者们无需再去操 心线程和锁了。Stream内部都已经做好了 。
个人的理解:Stream流就好像一座城市的饮用水管线,我们的数据就好像流水一样,在进入我们的管道后,通过各种过滤、杀菌、物质筛查等工序,最终流入千家万户。我们的数据也是一样,最初是比较综合、庞大的数据源,通过我们Stream流的查找、过滤、组合、计算、操作、分组等过程,执行完毕之后获取到我们想要的结果。
在这里插入图片描述
Stream流特征:

  • Stream流不存储数据
  • Stream流不改变数据源
  • Stream流不可重复执行

二、Stream流的分类

Stream流根据执行过程可分为:

  • 串行流:所谓串行流是指在Stream流执行过程中,在同一线程下逐一执行相应的操作,直到所有操作处理完成。
  • 并行流:所谓并行流是指在Stream流执行过程中,在多个线程中分别执行相应的操作,直到所有操作处理完成。

在这里插入图片描述

并行流在底层实现中,是沿用了Java7提供的fork/join分解合并框架进行实现。fork根据cpu核数进行数 据分块,join对各个fork进行合并。因并行流是通过多线程进行拆分额整合,所以需要保持线程安全,个人建议不要什么集合都通过Stream流进行操作。

注意:不是串行流就一定比并行流效率低,更不是流处理就一定比for循环效率低,要根据实际情况慎重选择

三、Stream流常用操作

Stream流多数是对集合或数组进行操作,根据操作的过程,可分为中间操作和终端操作。

  • 创建流:在Java8中,Collection
    接口被扩展,提供了两个获取流的默认方法。stream()方法返回一个串行流,parallelStream()方法返回一个并行流。
  • 中间操作:中间操作会返回一个流,可以通过这种方式将多个流或多个操作连接在一起,形成一个新的链条,从而获得新的流的结果,直到遇到一个终端操作,最终返回一个结果。中间操作又分为无状态操作(不受前一步操作的影响)和有状态操作(需要获取到所有元素后在进行操作)
  • 终端操作:终端操作就是通过流的处理最终得到一个结果。终端操作又分为短路操作(遇到符合条件的元素直接获得最终结果)和非短路操作(必须处理完所有元素才能得到最终结果)

在这里插入图片描述

public class Main {
	public static void main(String[] args) {
		List<String> nikeNames=new ArrayList<String>();
		nikeNames.add("1");
		nikeNames.add("2");
		nikeNames.add("3");
		List<User> list=new ArrayList<User>();
		list.add(new User("张三", 20, "男",nikeNames));
		list.add(new User("李四", 32, "男",nikeNames));
		list.add(new User("王五", 12, "女",nikeNames));
		list.add(new User("赵六", 32, "男",nikeNames));
		list.add(new User("钱七", 34, "女",nikeNames));
		list.add(new User("孙八", 21, "男",nikeNames));
		list.add(new User("周九", 54, "女",nikeNames));
		list.add(new User("冯十", 23, "女",nikeNames));
		
		list.stream().filter(user->user.getAge()>18).collect(Collectors.toList()).forEach(System.out::println);
		list.stream().peek(user->System.out.println("会员信息"+user)).forEach(System.out::println);
		list.stream().map(User::getName).forEach(System.out::println);
		list.stream().flatMap(user->user.getNikeNames().stream()).collect(Collectors.toList()).forEach(System.out::println);
		list.stream().limit(2).collect(Collectors.toList()).forEach(System.out::println);
		list.stream().skip(2).collect(Collectors.toList()).forEach(System.out::println);
		list.stream().distinct().forEach(System.out::println);
		list.stream().sorted().forEach(System.out::println);
		list.stream().sorted((u1,u2)->u1.getAge()-u2.getAge()).forEach(System.out::println);
		
	}

}

class User{
	private String name;
	private int age;
	private String sex;
	private List<String> nikeNames;
	
	public User() {
	}
	public User(String name, int age, String sex, List<String> nikeNames) {
		this.name = name;
		this.age = age;
		this.sex = sex;
		this.nikeNames = nikeNames;
	}
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String getSex() {
		return sex;
	}

	public void setSex(String sex) {
		this.sex = sex;
	}

	public List<String> getNikeNames() {
		return nikeNames;
	}

	public void setNikeNames(List<String> nikeNames) {
		this.nikeNames = nikeNames;
	}

	@Override
	public String toString() {
		return "User [name=" + name + ", age=" + age + ", sex=" + sex + "]";
	}
}

四、Stream的特点

  • Stream只能处理一次数据:Stream流的从一端获取数据源,在流中依次对元素进行操作,当元素通过流,便无法再对其进行操作,可以重新在数据源获取一个新的流进行操作
  • Stream流采用内部迭代方式:对集合进行处理,一般会使用迭代器的遍历方式,这是一种外部迭代;而对于处理Stream流,只要申明处理方式,处理过程由流对象自行完成,这是一种内部迭代,对于大量数据的迭代处理中,内部迭代比外部迭代要更加高效
  • Stream流为无存储: Stream流并不存储值;流的元素源自数据源(可能是某个集合、数组或I/O通道等等),通过一系列计算步骤得到
  • 函数式风格: 对Stream流的操作会产生一个结果,但流的数据源不会被修改
  • 惰性求值: 多数流操作都是以惰性方式实现,一遍遍历完成整个流水线操作,并可以用短路操作提供更高效的实现
  • 无需上界: Stream流可以被表达为无限流,用户不停地读取流直到满意的结果出现为止,集合是有限的,但流可以表达为无线流
  • 代码简练: 对于一些集合的迭代处理操作,使用Stream流编写可以十分简洁

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

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

相关文章

2023全栈开发人员职业路线图

0. 全栈开发人员职业路线图 全栈开发人员是IT行业中薪资最高的职业之一。 如果您想成为一名全栈开发人员&#xff0c;以下是2023年全栈开发人员路线图上的十一个步骤&#xff1a; 掌握敏捷开发和Scrum学习浏览器技术&#xff0c;如HTML和CSS熟练掌握JavaScript或TypeScript了…

单月涨粉303.72w,反差感才是主流吗?

据新抖「直播带货风向」数据显示&#xff0c;抖音4月的直播商品数量达到1021.32w&#xff0c;较上月的695.91w环比增长50.18%&#xff0c;直播销量环比增加16.81%。从这几个数值就可以看出4月的抖音电商依旧如火如荼...... 那么&#xff0c;4月&#xff0c;抖音又出现哪些新的看…

“世界中医药之都” 亳州市医保局领导一行莅临万民健康交流指导

为进一步推进智慧医疗、智慧服务、智慧管理“三位一体”为主旨的“智慧中医、健康社区”项目建设。2023 年 5 月 3 日&#xff0c;“世界中医药之都” 亳州市医保局 局长 吴旭春 、 医保中心主任秦克靖 、 办公室主任徐伟 等一行 5 人莅临 万民健康交流 指导工作 &#xff0c…

day27_mysql

今日内容 零、 复习昨日 一、单表查询 二、多表联查 零、 复习昨日 1 DDL,DML,DQL是啥 DDL 数据定义语言&#xff08;库&#xff0c;表&#xff0c;列&#xff09;DML 数据操作语言&#xff08;表内数据的操作增删改&#xff09;DQL 数据查询语言&#xff08;表内数据的查询&am…

酷游浅谈网站Javas cript型别

最近整理了一下&#xff0c;【酷游娜娜手机&#x1d54d;找看看nay3989提供】就决定跟大家讨论一下最近对于Javascripet的型别认识。 弱型别&#xff36;&#xff33; 强型别 Javascripet是一种「弱型别」的语言&#xff0c;所以会产生很多你意想不到恶心的事情 至于什么是弱…

软件测试、测试和开发、测试和调试【详细介绍】

目录 一、什么是软件测试 1.软件测试的定义 2.软件测试的目的 3.软件测试的不可穷性 二、开发和测试的区别 三、测试和调试的区别 一、什么是软件测试 在日常生活中&#xff0c;测试是无处不在的。比如新买的手机是否好用、新买的衣服穿着是否合身等等场景&#xff0c;均…

点成案例丨细胞培养芯片用于构建肠模型实例分享

器官芯片是一种利用微芯片制造技术制造的微流体细胞培养设备。该设备包含多个连续灌注腔室&#xff0c;具有多细胞层结构、组织界面、物理化学微环境以及人体血管循环等特征&#xff0c;可以模拟和重构人体器官的生理功能&#xff0c;为相关研究提供了可靠的平台。器官芯片技术…

java中设计模式总结

设计模式是实际工作中写的各种代码进行高层次抽象的总结&#xff0c;其中最出名的当属 Gang of Four (GoF) 的分类了&#xff0c;他们将设计模式分类为 23 种经典的模式&#xff0c;根据用途又可以分为三大类&#xff0c;分别为创建型模式、结构型模式和行为型模式。 有一些重…

【6D位姿估计】Point Pair Feature (PPF)

论文链接:Drost et al. Model Globally, Match Locally: Efficient and Robust 3D Object Recognition. CVPR, 2010. Model Globally, Match Locally 论文名字用 4 个词高度总结了 PPF 算法的精髓:“整体建模,局部匹配”。 下面这张图反应了论文的基本思想(算法概要): …

【鸿蒙应用ArkTS开发系列】- 导航栏Tab组件使用讲解

目录 Tabs介绍Tabs使用例子TabBar 样式设置定义菜单样式对象-NavigationItem定义一个底部菜单栏集合数据-NavigationList修改TabBuilder Tab 组件控制题外话 现在市场上的大部分应用&#xff0c;主页都是才用底部导航栏菜单作为页面主体框架来展示&#xff0c; 在鸿蒙中是使用…

STM32库函数笔记分享

之前刚开始自学的部分STM32笔记放出&#xff0c;希望对新入门STM32和想要复习库函数的小伙伴们起到帮助。 建立工程 1.寄存器操作方式 需要不断地查手册来了解每一位是干什么用的 优点&#xff1a;代码简介&#xff1b; 缺点&#xff1a;不太方便。 2.库函数操作方式 1.调用库函…

【leetcode热题100】接雨水、直方图最大矩形面积、矩阵中最大的矩形

文章目录 一、接雨水方法一&#xff1a;按列求&#xff08;动态规划&#xff09;方法二&#xff1a;双指针方法三&#xff1a;单调栈 二、直方图最大矩形面积单调栈哨兵位优化 三、矩阵中最大的矩形前缀和单调栈 一、接雨水 题目链接 题目描述&#xff1a; 给定 n 个非负整数…

JVM_垃圾回收器

目录 一、GC分类1.串行vs并行2.并发式vs独占式3.压缩式vs非压缩式4.年轻代vs老年代 二、GC评估指标1.吞吐量2.暂停时间3.小结 三、垃圾回收器都有哪些&#xff1f;1.GC发展史2.7种GC组合关系&#xff1f;3.为什么这么多GC4.如何查看默认GC?5.Serial GC&#xff1a;串行回收5.1…

字符设备驱动开发实验

我们以 chadev 这个虚拟设备为 例&#xff0c;完整的编写一个字符设备驱动模块。chadev 不是实际存在的一个设备&#xff0c;是为了方 便讲解字符设备的开发而引入的一个虚拟设备设备有两个缓冲区&#xff0c;一个为读缓冲 区&#xff0c;一个为写缓冲区&#xff0c;这两个缓冲…

Spring事务隔离级别详解

Spring有五大隔离级别&#xff1a; 1、ISOLATION_DEFAULT 2、ISOLATION_READ_UNCOMMITTED 3、ISOLATION_READ_COMMITTED 4、ISOLATION_REPEATABLE_READ 5、ISOLATION_SERIALIZABLE ISOLATION_DEFAULT 用底层数据库的设置隔离级别。 ISOLATION_READ_UNCOMMITTED 一个事…

java 数组创建的方法

数组是一个由一组元素组成的集合&#xff0c;我们可以用一个数组来表示集合。 java中最基本的数据类型是字符串&#xff0c;其长度是固定的&#xff0c;且不可变&#xff0c;一个字符串只能以一个数字开头。 在 Java中我们可以通过 myConst关键字来指定数组的长度。下面就看一下…

直线飙升到10万+star的AutoGpt,有多强?帮我写了个网页!

先来感受一下10万的star&#xff0c;到底有多强&#xff01; 从4月2日开始&#xff0c;直线飙升到10万star Auto-GPT是一个实验性的开源应用程序&#xff0c;展示了GPT-4语言模型的功能。这个程序由GPT-4驱动&#xff0c;将LLM“思想”链接在一起&#xff0c;以自主实现您设定的…

CTO解读:从“RSAC 2023”到“韧性数据安全”—Stronger Together

一年一度RSA Conference已落下帷幕。作为全球最具规模的安全大会&#xff0c;每年一届的RSAC都是安全行业的风向标。 2023年RSAC的主题是&#xff1a;Stronger Together&#xff0c;一起更强大。安全产品往往是场景化的&#xff0c;单点产品解决不同的问题&#xff0c;有机的整…

QT自制软键盘 最完美、最简单、跟自带虚拟键盘一样

QT自制软键盘 最完美、最简单、跟自带虚拟键盘一样 [1] QT自制软键盘 最完美、最简单、跟自带虚拟键盘一样一、本自制虚拟键盘特点二、windows打开系统自带软键盘三、让键盘界面保持在最上方、不改变底层界面焦点四、长按按键重复输入键盘内容五、模拟键盘点击事件完成虚拟键盘…

虹科方案|使用 HK-TRUENAS支持媒体和娱乐工作流程-2

一、支持 M&E 工作流程的HK-TRUENAS 屡获殊荣的 TrueNAS 存储解决方案支持单独的工作空间来存放可在现场或制作室访问的媒体资产。 TrueNAS 提供企业功能&#xff0c;支持多个物理和虚拟应用程序&#xff0c;并具有同步块和文件存储访问。 这些功能允许备份和重新利用视频、…