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

文章目录

  • 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);
    		}
    	}
    }
    

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

torch_scatter.scatter()的使用方法

学习目标&#xff1a; 在学习PyG时&#xff0c;遇到了 scatter 这个函数&#xff0c;经过学习加上自身的理解&#xff0c;记录如下以备复习 学习内容&#xff1a; src&#xff1a;表示输入的tensor&#xff0c;接下来被处理&#xff1b;index&#xff1a;表示tensor对应的索引…

机器学习 day14 ( 神经网络 )

神经网络的发展 最开始的动机&#xff1a;是通过构建软件来模拟大脑&#xff0c;但今天的神经网络几乎与大脑的学习方式无关 我们依据大脑中的神经网络&#xff0c;来构建人工神经网络模型。左图中&#xff1a;一个神经元可以看作一个处理单元&#xff0c;它有很多的输入/树突…

chatgpt赋能python:Python创建一个Animal类介绍

Python创建一个Animal类介绍 Python是一种高级编程语言&#xff0c;其简单易学、灵活性强、可读性高以及强大的库使得Python非常受欢迎。在Python中创建类非常容易且非常常见&#xff0c;我们可以使用Python创建各种类型的类。今天&#xff0c;我们将讨论如何使用Python创建一…

【时空权衡】

目录 知识框架No.0 时空权衡一、基本思想 No.1 计数排序一、比较计数二、分布计数 No.2 散列法一、开散列&#xff08;分离链&#xff09;二、闭散列&#xff08;开式寻址&#xff09; 知识框架 No.0 时空权衡 一、基本思想 其实时空权衡&#xff1a;是指在算法的设计中&…

进程信号(Linux)

进程信号 信号入门身边的信号进程信号 产生信号终端按键产生信号调用系统函数向目标进程发信号killraiseabort 硬件异常产生信号由软件条件产生信号 阻塞信号信号其他相关常见概念在内核中的表示sigset_t信号集操作函数sigprocmasksigpending 捕捉信号内核如何实现信号的捕捉si…

分布式简要说明

1.分布式简要说明 《分布式系统原理与范型》定义&#xff1a; 分布式系统是若干独立计算机的集合&#xff0c;这些计算机对于用户来说就像单个相关系统。 分布式系统 (distributed system) 是建立在网络之上的软件系统。 随着互联网的发展&#xff0c;网站应用的规模不断扩…

SAP-QM-物料主数据-质量管理视图字段解析

过账到质检库存&#xff1a;要勾选&#xff0c;否则收货后库存不进入质检库存HU检验&#xff1a;收货到启用HU管理的库位时产生检验批&#xff0c;例如某个成品物料是收货到C002库位&#xff0c;该库位启用了HU管理&#xff0c;那么此处要勾选。但是如果勾选了&#xff0c;却收…

04.hadoop上课笔记之java编程和hbase

1.win查看服务 netstat -an #linux也有#R数学建模语言 SCALAR 2.java连接注意事项,代码要设置用户 System.setProperty("HADOOP_USER_NAME", "hadoop");3.伪分布式的好处(不用管分布式细节,直接连接一台机器…,适合用于学习) 4.官方文档 查看类(static |…

Python期末复习题库(下)——“Python”

小雅兰期末加油冲冲冲&#xff01;&#xff01;&#xff01; 1. (单选题)下列关于文件打开模式的说法,错误的是( C )。 A. r代表以只读方式打开文件 B. w代表以只写方式打开文件 C. a代表以二进制形式打开文件 D. 模式中使用时,文件可读可写 2. (单选题)下列选项中,以追加…

webpack的使用

一、什么是webpack&#xff1f; webpack是一个前端构建工具&#xff0c;目前比较主流的构建工具&#xff0c;自定义的模块比较多。 二、应用场景 vue、react、angular 都可以通过webpack构建全部可供访问的页面数量不超过500个 三、安装 通过npm方式在项目根目录下执行命令…

htmlCSS-----CSS选择器(下)

目录 前言&#xff1a; 2.高级选择器 &#xff08;1&#xff09;子代选择器 &#xff08;2&#xff09;伪类选择器 &#xff08;3&#xff09;后代选择器 &#xff08;4&#xff09;兄弟选择器 相邻兄弟选择器 通用兄弟选择器 &#xff08;5&#xff09;并集选择器 &am…

【JavaSE】Java基础语法(二十六):Collection集合

文章目录 1. 数组和集合的区别2. 集合类体系结构3. Collection 集合概述和使用【应用】4. Collection集合的遍历【应用】5. 增强for循环【应用】 1. 数组和集合的区别 相同点 都是容器,可以存储多个数据不同点 数组的长度是不可变的,集合的长度是可变的 数组可以存基本数据类型…

基于Yarn搭建Flink

基于Yarn搭建Flink 1. 概述 1.1 Yarn 简介 Apache Hadoop YARN是一个资源提供程序&#xff0c;受到许多数据处理框架的欢迎。Flink服务被提交给 YARN 的 ResourceManager&#xff0c;后者再由 YARN NodeManager 管理的机器上生成容器。Flink 将其 JobManager 和 TaskManager…

python爬虫笔记

Python爬虫笔记 一. Urllib 1. 基础请求 指定url请求返回值解码返回结果的一些操作 import urllib.request as req # 定义一个url url http://www.baidu.com# 发送请求获得相应 res req.urlopen(url)# read返回字节形式的二进制数据,需要用指定编码来解码 content res.r…

vue的虚拟DOM

vue的虚拟DOM 什么是虚拟DOM 虚拟DOM提供了一个与平台无关的抽象层&#xff0c;将应用程序的界面表示抽象为一个虚拟的DOM树。这意味着开发人员可以使用相同的代码和逻辑来描述应用程序的用户界面&#xff0c;而不需要关心具体的平台实现细节。虚拟DOM允许开发人员使用一种统…

Linux命令

准备工作 安装centos7 在镜像网下载DVD.iso或者DVD.torrent&#xff08;bit种子&#xff09;。在VMware中配置相应的信息&#xff0c;并引入iso文件&#xff0c;以便后续安装。local中&#xff1a;选择语言和时区上海software中&#xff1a;选择安装软件的内容&#xff0c;可…

基于多动作深度强化学习的柔性车间调度研究(Python代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

通过location实现几秒后页面跳转

location对象属性 location对象属性 返回值location.href获取或者设置整个URLlocation.host返回主机&#xff08;域名&#xff09;www.baidu.comlocation.port 返回端口号&#xff0c;如果未写返回空字符串location.pathname返回路径location.search返回参数location.hash返回…

Apache网页与安全优化

一、Apache网页优化 在企业中&#xff0c;部署Apache后只采用默认的配置参数&#xff0c;会引发网站很多问题&#xff0c;换言之默认配置是针对以前较低的服务器配置的&#xff0c;以前的配置已经不适用当今互联网时代。为了适应企业需求&#xff0c;就需要考虑如何提升Apache…

遗传算法(Genetic Algorithm)

本文为阅读《遗传算法原理及应用》的笔记和心得 ISBN&#xff1a;7-118-02062-1 遗传算法简介 遗传算法是模拟生物在自然环境中的遗传和进化过程中而形成的一种自适应全局优化概率搜索算法 总的来说&#xff0c;求最优解解或近似最优解的方法主要有三种&#xff1a;枚举法、启…