Stream流-Java

Stream流的作用:

结合了Lambda表达式,简化集合,数组的操作

Stream流的使用步骤:

1. 先得到一条Stream流(流水线),并把数据放上去

获取方式方法名说明
单列集合default Stream<E> stream()Collection中的默认方法
双列集合无法直接使用stream流
数组public static <T> Stream<T> stream(T[] array)Arrays工具类中的静态方法
一堆零散数据public static<T> Stream<T> of(T... values)Stream接口中的静态方法
				//1.单列集合获取Stream流ArrayList<String> list = new ArrayList<>();Collections.addAll(list,"a","b","c","d","e","f","g","h");//获取到一条流水线,并把集合中的数据放到流水线上Stream<String> stream = list.stream();//使用终结方法打印一下流水线上的所有数据stream.forEach(new Consumer<String>() {@Overridepublic void accept(String s) {//s表示流水线上的每一个数据System.out.println(s);}});//forEach方法中的参数类型是Consumer<? super T> ,而这个参数类型点到源码会发现他是//一个函数式接口,因此也就可以使用lambda表达式简化上述代码。list.stream().forEach(s -> System.out.println(s));
			  //双列集合    无法直接使用stream流//1.创建双列集合HashMap<String, Integer> hm = new HashMap<>();//2.添加数据hm.put("aaa",111);hm.put("bbb",222);hm.put("ccc",333);hm.put("ddd",444);//3.第一种获取stream流hm.keySet().stream().forEach(s -> System.out.println(s));//4.第二种获取stream流hm.entrySet().stream().forEach(s -> System.out.println(s));
//一堆零散数据    public static<T> Stream<T> of(T... values)    Stream接口中的静态方法
Stream.of(1,2,3,4,5).forEach(s -> System.out.println(s));
Stream.of("a","b","c").forEach(s -> System.out.println(s));
注意:

Stream接口中静态方法of的细节

方法的形参是一个可变参数,可以传递一堆零散的数据,也可以传递数组

但是数组必须是引用数据类型的,如果传递基本数据类型,是会把整个数组当作一个元素,存放到Stream当中。

2. 利用Stream流中的API进行各种操作

  1. 中间方法:方法调用完毕之后,还可以调用其他方法
Stream<T> filter (Predicate<?super T>predicate)过滤
Stream<T> limit (long maxSize)获取前几个元素
Stream<T> skip (long n)跳过前几个元素
Stream<T> distinct()元素去重,依赖(hashCode和equals方法)
static<T>Stream<T> concat (Stream a,Streamb)合并a和b两个流为一个流
Stream<R> map (Function<T,R> mapper)转换流中的数据类型

注意一:中间方法,返回新的Stream流,原来的Stream流只能使用一次,建议使用链式编程。

注意二:修改Stream流中的数据,不会影响原来集合或者数组中的数据。

  1. 终结方法:最后一步,调用完之后,不能调用其他方法
名称说明
void forEach(Consumer action)遍历
long count()统计
toArray()收集流中的数据,放到数组中
collect(Collector collector)收集流中的数据,放到集合中(List(可以有重复元素) Set(没有重复元素) Map)
				ArrayList<String> list = new ArrayList<>();Collections.addAll(list,"a","b","c");/*** IntFunction 的泛型:具体类型的数组* apply的形参:流中数据的个数,要跟数组的长度保持一致* apply的返回值:具体类型的数组* 方法体:就是创建数组** toArray方法的参数的作用:负责创建一个指定类型的数组* toArray方法的底层,会依次得到流里面的每一个数据,并把数据放到数组当中* toArray方法的返回值:是一个装着流里面所有数据的数组**/String[] array = list.stream().toArray(new IntFunction<String[]>() {@Overridepublic String[] apply(int value) {return new String[value];}});System.out.println(Arrays.toString(array));String[] array1 = list.stream().toArray(value -> new String[value]);System.out.println(Arrays.toString(array1));
				ArrayList<String> list = new ArrayList<>();Collections.addAll(list,"a-男-11","b-男-34","c-男-24","d-男-22","e-女-13","f-女-51","g-女-15");Map<String, Integer> collect = list.stream().filter(s -> "男".equals(s.split("-")[1]))/*** toMap:参数一表示键的生成规则*        参数二表示值的生成规则** 参数一:*     Function泛型一:表示流中每一个数据的类型*         泛型二:表示Map集合中键的数据类型*     方法apply形参:依次表示流里面的每一个数据*         方法体:生成键的代码*         返回值:已经生成的键** 参数二:*     Function泛型一:表示流中每一个数据的类型*         泛型二:表示Map集合中值的数据类型*     方法apply形参:依次表示流里面的每一个数据*         方法体:生成值的代码*         返回值:已经生成的值*/.collect(Collectors.toMap(new Function<String, String>() {@Overridepublic String apply(String s) {return s.split("-")[0];}},new Function<String, Integer>() {@Overridepublic Integer apply(String s) {return Integer.parseInt(s.split("-")[2]);}}));System.out.println(collect);Map<String, Integer> collect1 = list.stream().filter(s -> "男".equals(s.split("-")[1])).collect(Collectors.toMap(s -> s.split("-")[0],s -> Integer.parseInt(s.split("-")[2])));System.out.println(collect1);

注意:

如果我们要收集到Map集合当中,键不能重复,否则会报错。

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

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

相关文章

Leetcode 327. 区间和的个数

1.题目基本信息 1.1.题目描述 给你一个整数数组 nums 以及两个整数 lower 和 upper 。求数组中&#xff0c;值位于范围 [lower, upper] &#xff08;包含 lower 和 upper&#xff09;之内的 区间和的个数 。 区间和 S(i, j) 表示在 nums 中&#xff0c;位置从 i 到 j 的元素…

MinIO 版本管理实践指南(附完整 Go 示例)

✨ 前言 在构建企业级对象存储系统时,“对象的版本管理”是一个关键特性。MinIO 作为一款高性能、Kubernetes 原生的 S3 兼容对象存储系统,也支持强大的版本控制功能。 本文将通过 Go 示例代码 + 实操讲解 的形式,手把手带你掌握 MinIO 的版本控制能力,包括开启版本控制、…

数组toString方法及类型检测修复方案

在 JavaScript 中&#xff0c;数组的 toString() 方法被覆盖&#xff08;重写&#xff09;为返回数组元素的逗号分隔字符串&#xff0c;而不是原始的 [object Array] 类型标识。以下是详细解释和修复方案&#xff1a;问题原因Array.prototype.toString 被覆盖数组继承自 Object…

mysql索引底层B+树

B树胜出的关键特性&#xff1a;矮胖树结构&#xff1a;3-4层高度即可存储2000万条记录&#xff08;假设每页存1000条&#xff09; 叶子链表&#xff1a;所有数据存储在叶子节点&#xff0c;并通过双向链表连接 非叶导航&#xff1a;非叶子节点仅存储键值&#xff0c;不保存数据…

AI开放课堂:钉钉MCP开发实战

我们正处在AI技术爆发的时代&#xff0c;也处于企业数字化蓬勃发展的时代。如何利用AI技术&#xff0c;突破模型自身知识的局限&#xff0c;安全、高效地与外部世界连接和交互&#xff0c;是当前所有AI开发者在企业数字化中面临的问题之一。 MCP&#xff08;Model Context Prot…

DigitalOcean 一键模型部署,新增支持百度开源大模型ERNIE 4.5 21B

使用过DigitalOcean GPU Droplet 服务器的用户应该对我们的一键模型部署功能不陌生。DigitalOcean 的一键模型部署 (1-Click Models) 功能是 DO 为开发者和企业提供的一种便捷方式&#xff0c;用于快速部署和运行预训练的生成式 AI 模型&#xff0c;尤其是大型语言模型 (LLM)。…

【嵌入式面试】嵌入式笔试与面试宝典(offer必来)

&#x1f48c; 所属专栏&#xff1a;【嵌入式面试】 &#x1f600; 作  者&#xff1a;兰舟比特 &#x1f43e; &#x1f680; 个人简介&#xff1a;热爱开源系统与嵌入式技术&#xff0c;专注 Linux、网络通信、编程技巧、面试总结与软件工具分享&#xff0c;持续输出实用干…

企业级数据分析创新实战:基于表格交互与智能分析的双引擎架构

引言&#xff1a;数字化转型中数据协同困境与系统融合挑战 在数字化转型实践中&#xff0c;企业普遍面临数据系统与业务运营的协同困境&#xff0c;主要表现为数据处理平台与核心业务流程的架构隔离、分析成果与决策闭环的价值断层、以及双重数据维护带来的资源损耗。这种系统…

openbmc 日志系统继续分析

1.说明 1.1 总体说明 本节是继: https://blog.csdn.net/wit_yuan/article/details/147142407?spm=1011.2415.3001.5331 后的继续分析的文档。 该篇内容主要目的是分析整个openbmc的日志系统。 注意解读文档: https://github.com/openbmc/docs/blob/master/designs/event-l…

【JIRA小白如何使用它进行bug管理】

JIRA小白如何使用它进行bug管理 提示&#xff1a;入职一般来说&#xff0c;公司会提供账号&#xff0c;不需要部署如何提bug&#xff1a; JIRA有两种提交方式 在执行测试用例中在bug管理项目中新建提bug建议或者注意事项&#xff1a; 标题&#xff1a;执行完A之后&#xff0c;发…

陪诊小程序系统开发:开启医疗陪护新时代

在快节奏的现代生活中&#xff0c;人们面临着各种各样的压力&#xff0c;健康问题也日益凸显。当生病就医时&#xff0c;尤其是对于老年人、孕妇、残障人士等特殊群体&#xff0c;独自前往医院往往会遇到诸多困难&#xff0c;如不熟悉医院流程、行动不便、心理上感到孤独无助等…

Leetcode—1035. 不相交的线【中等】

2025每日刷题&#xff08;214&#xff09; Leetcode—1035. 不相交的线最长公共子序列长度&#xff08;Longest Common Subsequence&#xff0c;LCS&#xff09; 给定两个序列&#xff08;如字符串或数组&#xff09;&#xff0c;最长公共子序列&#xff08;LCS&#xff09;是同…

使用 Conda 工具链创建 UV 本地虚拟环境全记录——基于《Python 多版本与开发环境治理架构设计》

Python 多版本环境治理理念驱动的系统架构设计&#xff1a;三维治理、四级隔离、五项自治 原则-CSDN博客 Python 多版本与开发环境治理架构设计-CSDN博客 【终极实战】Conda/Poetry/Virtualenv/Pipenv/Hatch 多工具协同 AnacondaPyCharm&#xff1a;构建 Python 全版本栈隔离…

一文通透mamba2「力证Transformer are SSM」:从SSM、半可分矩阵、SMA、SSD到mamba2

前言 实话说&#xff0c;过去一两月一直忙着我司两大类项目的推进 一类是正在逐一上线基于大模型的论文翻译、论文审稿、论文对话、论文修订/润色、论文idea提炼等等(截止到24年8月底&#xff0c;其中的审稿和翻译已上线七月官网 )一类是正在抓紧做面向一个个工厂的具身智能机…

【Java基础06】ArrayList

文章目录1.ArrayList1.1 集合的基本使用1.2 集合的创建和成员方法1.3 练习一&#xff1a;集合的遍历基本数据类型对应的包装类1.4 练习二&#xff1a;使用集合存储并遍历学生对象1.4 练习三&#xff1a;添加用户对象并判断是否存在写方法要思考的步骤1.5 练习四&#xff1a;添加…

ddos 放在多个云主机,同时运行

1. 起因&#xff0c; 目的: 我打开 grok, 被 cloudflare 拦截&#xff0c;问我是不是机器人。 这个情况&#xff0c;如果是别的小网站也就算了&#xff0c;很正常。 大公司也搞这种东西&#xff0c;要么是偷懒&#xff0c;要么是太小气了。 一气之下&#xff0c;我决定写个 ddo…

lspci/setpci用法小结

目录 1.lspci用法小结 2.lspci -t 3.setpci用法小结 1.lspci用法小结 参考博客&#xff1a;【PCIe】lspci用法小结 - 知乎 lspci是一个用来显示系统中所有PCI总线设备或者连接到该总线上所有设备的工具 man lspci lspci(8) …

光通信从入门到精通:PDH→DWDM→OTN 的超详细演进笔记

光通信从入门到精通&#xff1a;PDH→DWDM→OTN 的超详细演进笔记 作者&#xff1a; 脱脱克克 日期&#xff1a;2025-07-24 关键词&#xff1a;DWDM、OTN、G.709、光纤、带宽、C-band、L-band、DSP、ROADM 摘要 本文用一条“高速公路”的比喻&#xff0c;把 40 年光传输技术演进…

安全初级——网页

网页代码<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>用户登录</title><script src&…

JVM原理及其机制(二)

目录 一 . 垃圾回收机制&#xff08;GC&#xff09; 二 . 垃圾回收的具体步骤 &#xff08;1&#xff09;先找出谁是垃圾 方案一&#xff1a;引用计数 方案二&#xff1a;可达性分析 &#xff08;2&#xff09;释放垃圾的内存空间 方案一&#xff1a;标记清除 方案二…