【JavaSE】Java基础语法(三十二):Stream流

news2024/11/25 22:25:28

文章目录

  • 1. 体验Stream流
  • 2. Stream流的常见生成方式
  • 3. Stream流中间操作方法【应用】
  • 4. Stream流终结操作方法【应用】
  • 5. Stream流的收集操作


在这里插入图片描述

1. 体验Stream流

  • 案例需求
    按照下面的要求完成集合的创建和遍历
    • 创建一个集合,存储多个字符串元素
    • 把集合中所有以"张"开头的元素存储到一个新的集合
    • 把"张"开头的集合中的长度为3的元素存储到一个新的集合
    • 遍历上一步得到的集合
  • 原始方式示例代码
public class StreamDemo {
	public static void main(String[] args) {
	
	//创建一个集合,存储多个字符串元素
	ArrayList<String> list = new ArrayList<String>();
	list.add("刘亦菲");
	list.add("宋祖儿");
	list.add("林黛玉");
	list.add("江疏影");
	list.add("张敏");
	list.add("张无忌");
	
	//把集合中所有以"张"开头的元素存储到一个新的集合
	ArrayList<String> zhangList = new ArrayList<String>();
	for(String s : list) {
		if(s.startsWith("张")) {
			zhangList.add(s);
		}
	}
	
	// System.out.println(zhangList);
	//把"张"开头的集合中的长度为3的元素存储到一个新的集合
	ArrayList<String> threeList = new ArrayList<String>();
	for(String s : zhangList) {
		if(s.length() == 3) {
			threeList.add(s);
		}
	}
	
	// System.out.println(threeList);
	//遍历上一步得到的集合
	for(String s : threeList) {
		System.out.println(s);
	}
	System.out.println("--------");
	
	//Stream流来改进
	// list.stream().filter(s -> s.startsWith("张")).filter(s ->
	s.length() == 3).forEach(s -> System.out.println(s));
	list.stream().filter(s -> s.startsWith("张")).filter(s -> s.length()
	== 3).forEach(System.out::println);
	}
}

使用Stream流示例代码

public class StreamDemo {
	public static void main(String[] args) {
		//创建一个集合,存储多个字符串元素
		ArrayList<String> list = new ArrayList<String>();
		list.add("刘亦菲");
		list.add("宋祖儿");
		list.add("林黛玉");
		list.add("江疏影");
		list.add("张敏");
		list.add("张无忌");
		
		//Stream流来改进
		list.stream().filter(s -> s.startsWith("张")).filter(s -> s.length()
		== 3).forEach(System.out::println);
		}
}

  • Stream流的好处
  • 直接阅读代码的字面意思即可完美展示无关逻辑方式的语义:获取流、过滤姓张、过滤长度
    为3、逐一打印
  • Stream流把真正的函数式编程风格引入到Java中
  • 代码简洁

2. Stream流的常见生成方式

  • Stream流的三类方法
    • 获取Stream流
      • 创建一条流水线,并把数据放到流水线上准备进行操作
    • 中间方法
      • 流水线上的操作
      • 一次操作完毕之后,还可以继续进行其他操作
    • 终结方法
      • 一个Stream流只能有一个终结方法
      • 是流水线上的最后一个操作

  • 生成Stream流的方式(获取流)
    • Collection体系集合
      • 使用默认方法stream()生成流, default Stream stream()
    • Map体系集合
      • 把Map转成Set集合,间接的生成流
    • 数组
      • 通过Arrays中的静态方法stream生成流
    • 同种数据类型的多个数据
      • 通过Stream接口的静态方法of(T… values)生成流

  • 代码演示
public class StreamDemo {
	public static void main(String[] args) {
		//Collection体系的集合可以使用默认方法stream()生成流
		List<String> list = new ArrayList<String>();
		Stream<String> listStream = list.stream();
		Set<String> set = new HashSet<String>();
		Stream<String> setStream = set.stream();
		
		//Map体系的集合间接的生成流
		Map<String,Integer> map = new HashMap<String, Integer>();
		Stream<String> keyStream = map.keySet().stream();
		Stream<Integer> valueStream = map.values().stream();
		Stream<Map.Entry<String, Integer>> entryStream =
		map.entrySet().stream();
		
		//数组可以通过Arrays中的静态方法stream生成流
		String[] strArray = {"hello","world","java"};
		Stream<String> strArrayStream = Arrays.stream(strArray);
		
		//同种数据类型的多个数据可以通过Stream接口的静态方法of(T... values)生成流
		Stream<String> strArrayStream2 = Stream.of("hello", "world",
		"java");
		Stream<Integer> intStream = Stream.of(10, 20, 30);
	}
}

3. Stream流中间操作方法【应用】

  • 概念
    中间操作的意思是,执行完此方法之后,Stream流依然可以继续执行其他操作

  • 常见方法
    在这里插入图片描述

代码演示
Java8 - Stream


4. Stream流终结操作方法【应用】

  • 概念
    终结操作的意思是,执行完此方法之后,Stream流将不能再执行其他操作

  • 常见方法

在这里插入图片描述

  • 代码演示
public class StreamDemo {
	public static void main(String[] args) {
		//创建一个集合,存储多个字符串元素
		ArrayList<String> list = new ArrayList<String>();
		list.add("刘亦菲");
		list.add("宋祖儿");
		list.add("林黛玉");
		list.add("江疏影");
		list.add("张敏");
		list.add("张无忌");
		
		//需求1:把集合中的元素在控制台输出
		// list.stream().forEach(System.out::println);
		
		//需求2:统计集合中有几个以张开头的元素,并把统计结果在控制台输出
		long count = list.stream().filter(s -> s.startsWith("张")).count();
		System.out.println(count);
	}
}

5. Stream流的收集操作

  • 概念
    对数据使用Stream流的方式操作完毕后,可以把流中的数据收集到集合中
    Stream流里面不会改变集合数据源中的数据的,需要收集

  • 常用方法

    //	把结果收集到集合中
    R collect(Collector collector) 
    
  • 工具类Collectors提供了具体的收集方式
    在这里插入图片描述

  • 代码演示

    public class CollectDemo {
    	public static void main(String[] args) {
    		//创建List集合对象
    		List<String> list = new ArrayList<String>();
    		list.add("刘亦菲");
    		list.add("宋祖儿");
    		list.add("林黛玉");
    		list.add("江疏影");
    		/*
    		//需求1:得到名字为3个字的流
    		Stream<String> listStream = list.stream().filter(s -> s.length() ==
    		3);
    		
    		//需求2:把使用Stream流操作完毕的数据收集到List集合中并遍历
    		List<String> names = listStream.collect(Collectors.toList());
    		for(String name : names) {
    		System.out.println(name);
    		}
    		*/
    		
    		//创建Set集合对象
    		Set<Integer> set = new HashSet<Integer>();
    		set.add(10);
    		set.add(20);
    		set.add(30);
    		set.add(33);
    		set.add(35);
    		
    		/*
    		//需求3:得到年龄大于25的流
    		Stream<Integer> setStream = set.stream().filter(age -> age > 25);
    		//需求4:把使用Stream流操作完毕的数据收集到Set集合中并遍历
    		Set<Integer> ages = setStream.collect(Collectors.toSet())
    		for(Integer age : ages) {
    		System.out.println(age);
    		}
    		*/
    		
    		//定义一个字符串数组,每一个字符串数据由姓名数据和年龄数据组合而成
    		String[] strArray = {"刘亦菲,30", "宋祖儿,35", "林黛玉,33", "江疏影,25"};
    		
    		//需求5:得到字符串中年龄数据大于28的流
    		Stream<String> arrayStream = Stream.of(strArray).filter(s ->
    		Integer.parseInt(s.split(",")[1]) > 28);
    		
    		//需求6:把使用Stream流操作完毕的数据收集到Map集合中并遍历,字符串中的姓名作键,年龄作值
    		Map<String, Integer> map = arrayStream.collect(Collectors.toMap(s ->
    		s.split(",")[0], s -> Integer.parseInt(s.split(",")[1])));
    		Set<String> keySet = map.keySet();
    		for (String key : keySet) {
    			Integer value = map.get(key);
    			System.out.println(key + "," + value);
    		}
    	}
    }
    

在这里插入图片描述

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

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

相关文章

Python文件打包成exe文件

文章目录 背景安装pyinstaller开始打包总结 背景 今天因为在线将pdf转为word被收费了&#xff0c;有点不爽&#xff0c;所以自己动手撸一个pdf转word的小工具&#xff0c;想着打包成exe给朋友使用&#xff0c;万一哪天会用到呢&#xff1f; 安装pyinstaller 打开cmd命令窗口…

【AGC】云监控日志服务查询不到Logger日志相关问题

【关键字】 AGC、云监控、日志服务 【问题描述】 开发者反馈在使用AGC云监控&#xff0c;填写了Logger日志&#xff0c;但是在云监控的日志服务查不到的问题。具体如下所述&#xff1a; 云函数按要求写了Logger日志&#xff0c;但是在云监控的日志服务页面查询不到&#xff…

R语言混合效应(多水平/层次/嵌套)模型及 贝叶斯实现技术

回归分析是科学研究中十分重要的数据分析工具。随着现代统计技术发展&#xff0c;回归分析方法得到了极大改进。混合效应模型&#xff08;Mixed effect model&#xff09;&#xff0c;即多水平模型&#xff08;Multilevel model&#xff09;/分层模型(Hierarchical Model)/嵌套…

【计算思维题】少儿编程 蓝桥杯青少组计算思维 数学逻辑思维真题详细解析第7套

少儿编程 蓝桥杯青少组计算思维 数学逻辑思维真题详细解析第7套 1、下图中,乐乐家的位置用数对(4,3)表示,学校在乐乐家西南方向。下列选项中,学校的位置不可能是 A、(5,4) B、(2,2) C、(2,1) D、(1,2) 答案:A 考点分析:主要考查小朋友们的观察能力和方…

springboot聚合项目程打包,提示包不存在

报错提示如下&#xff0c;这是子模块large_screen调用login_security模块时&#xff0c;找不到login_security的包&#xff0c;但是login_security能单独打包成功 项目结构&#xff0c;两个子模块可以启动 解决办法&#xff1a; 父pom,要用 <packaging>pom</packag…

基础sql代码讲解含运行截图(详细版)

用student表为例&#xff0c;表的结构如下&#xff1a; 查询student表中的全部数据 SELECT * FROM student 插入数据&#xff1a; INSERT INTO student (id,name,phone,age) VALUES (2,张,1123,19) 还可以不写字段名字进行插入&#xff0c;但是此种方式必须和数据库字段一一…

3:String类

文章目录 String类1&#xff1a;介绍&#xff1a;2&#xff1a;String类实现了很多的接口&#xff1a;3&#xff1b;String类常用构造器4&#xff1a;不同方式创建String类对象的区别&#xff08;1&#xff09;直接赋值的方式&#xff08;2&#xff09;常规new的方式&#xff0…

租赁行业提供固定资产管理的解决方案

在租赁行业&#xff0c;固定资产管理和盘点是非常重要的环节。然而&#xff0c;由于资产数量庞大、资产分散、资产更新频繁等因素&#xff0c;使得固定资产管理和盘点变得十分复杂和繁琐。为了解决这些问题&#xff0c;易点易动固定资产管理系统应运而生。 易点易动固定资产管…

vulnhub 靶机渗透:Stapler

Stapler nmap扫描21 端口22 53端口80端口目录爆破 139端口666 端口3306端口12380端口获取数据库root权限获取系统立足点提权 其他思路系统立足点1系统立足点2提权1提权2 https://www.vulnhub.com/entry/stapler-1,150/ 靶机ip:192.168.54.27 kali ip:192.168.54.128 nmap扫描 …

【剑指offer】数据结构——树

目录 数据结构——树直接解【剑指offer】07. 重建二叉树【剑指offer】08. 二叉树的下一个结点【剑指offer】26. 树的子结构【剑指offer】27. 二叉树的镜像【剑指offer】28. 对称的二叉树【剑指offer】32.1 从上到下打印二叉树【剑指offer】32.2 从上到下打印二叉树2【剑指offer…

考研C语言第六章

6.2指针 类似寻宝图&#xff0c;先把地址存储到指针变量里面&#xff0c;然后去找这个地址 指针大小 当64bit——8bit 当32bit——4bit 定义指针一定要和里面的数定义一样类型的 6.3指针的传递使用场景 指针的使用场景&#xff1a;传递和偏移 &#xff08;不需要的话就别用指…

opencv_c++学习(二十八)

一、单目相机位姿估计 如上图所示&#xff0c;根据图像的情况反推相机的运动情况。 如实现上述功能则需要拍摄当前物体的图像&#xff0c;然后拍摄一段时间之后物体的图像&#xff0c;然后联合两张图像则可以获取两个时刻的相机位姿关系。 位姿估计函数&#xff1a; bool cv:s…

Musl libc 库成功适配到 openEuler Embedded,推动欧拉嵌入式生态发展

近期&#xff0c;RISC-V SIG 在欧拉嵌入式操作系统上成功实现了 musl libc 的适配&#xff0c;完成了使用 musl libc 库替换 glibc 库构建镜像的工作。目前&#xff0c;以 musl libc 为基础库编译的镜像已在 Raspberry Pi4 开发板上可用&#xff0c;这一成果推动了 openEuler E…

C Primer Plus第十一章编程练习答案

学完C语言之后&#xff0c;我就去阅读《C Primer Plus》这本经典的C语言书籍&#xff0c;对每一章的编程练习题都做了相关的解答&#xff0c;仅仅代表着我个人的解答思路&#xff0c;如有错误&#xff0c;请各位大佬帮忙点出&#xff01; 1.设计并测试一个函数&#xff0c;从输…

《Opencv3编程入门》学习笔记—第二章

《Opencv3编程入门》学习笔记 记录一下在学习《Opencv3编程入门》这本书时遇到的问题或重要的知识点。 第二章 OpenCV 官方例程引导与赏析 openv官方提供的示例程序&#xff1a;具体位于..\opencv\sources\samples\cpp ..\opencv\sources\samples\cpp\tutorial_code路径下存…

sql优化常用的方法

文章目录 1、explain 输出执行计划2、in 和 not in 要慎用3、少用select *4、善用limit 15、 order by字段建索引6、count(*)推荐使用7、where 子句中避免is null /is not null8、应尽量避免在 where!或<>9、应尽量避免在 where 子句中使用 or10、尽量用union all代替uni…

了不起的互联网老男孩,在创业路上不掉队

“青春如同奔流的江河&#xff0c;一去不回来不及道别”&#xff0c;老男孩这首歌戳中了太多职场中年男人的心酸苦楚&#xff0c;面对经济下行压力、互联网行业变革以及中年职场危机&#xff0c;互联网人应该如何应对&#xff1f;如何建立和现实叫板的能力&#xff1f; 有2位在…

shiro入门实战

​​​​​​​Apache Shiro | Simple. Java. Security. java语言编写 架构 shiro认证流程 使用 添加shiro依赖 <dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-core</artifactId><version>1.4.0</version>&l…

V2.0-在记事本功能上添加fork和wait

第一篇只是简单使用了open&#xff0c;read,write,lseek实现了基本的记事本功能&#xff1b; 但是当前的系统是linux&#xff0c;应该发挥他的多进程&#xff0c;多线程的作用&#xff1b; 所以&#xff0c;本篇添加创建子进程和父进程等待子进程退出的功能。 有几个注意点&a…

如何创建新一代Web3企业

日前&#xff0c;我们对话了Sui基金会的增长负责人Koh Kim&#xff0c;对如何成功构建持续发展的企业等话题展开讨论。 您在Sui基金会的工作重点帮助开发者&#xff0c;让他们从产品开发的早期阶段成长为强大且具有潜力的企业领导者。可以简单分享一下您为此目标创建的计划吗&…