当前位置: 首页 > news >正文

Stream流的思想和获取Stream流

首先介绍的概念:

流可以理解为一条流水线,在这条流水线中有许多操作,比如筛选所需要的数据,输出打印等,

经过这条流水线,可以获取到自己所需要的数据:

-->所以:

  • Stream流的作用:

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

  • Stream流的使用步骤:
    1. 先得到一条Stream流(流水线),并把数据放上去

    2. 利用Stream流中的中间API即中间方法(如数据过滤,类型转换)对流水线上的数据进行操作

    3. 利用Stream流中的终结API即终结方法(如数据统计,数据打印)对流水线上的数据进行操作

      中间方法:该方法调用完毕后,还可以调用其他方法;

      终结方法:最后一步,该方法调用完毕之后,不能再调用其他方法。


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

1.获取Stream流的方法:

注:1)双列集合无法直接使用stream流,必须先用keySet方法(获取所有的键)或entrySet方法(获取到所有键值对对象的单

列集合)将其转换为单列集合,才能使用stream流

2)一堆零散数据必须是同种数据类型。

3)类Arrays里的stream方法:在类Arrays里,stream方法为静态的,可以直接类名.方法名进行调用:

4)一堆零散的数据获取stream流要用到接口Stream中的静态方法of(可以直接类名.方法名进行调用),该方法的形参

属于可变参数(可变参数底层就是一个数组),of方法返回Stream流。

2.获取Stream流的方法演示:

a.单列集合获取stream流:
获取stream流方法一:
package com.itheima.a01mystream;
​
import java.util.ArrayList;
import java.util.Collections;
import java.util.function.Consumer;
import java.util.stream.Stream;
​
public class StreamDemo2 {public static void main(String[] args) {//1.创建集合ArrayList<String> list=new ArrayList<>();
​//2.利用集合的工具类(Collections)添加数据Collections.addAll(list,"a","b","c","d","e");
​//3.获取stream流:要用到Collection这个接口中的默认方法stream/* ArrayList集合是Collection这个接口的实现类,所以可以直接调用默认方法stream *///获取到一条流水线,并把集合中的数据放到流水线上Stream<String> stream1 = list.stream();
​//4.使用终结方法打印一下流水线上的所有数据(用到了匿名内部类)stream1.forEach(new Consumer<String>() {@Overridepublic void accept(String s) {//s:依次表示流水线上的每一个数据System.out.println(s);}});}
}
获取stream流方法二:
package com.itheima.a01mystream;
​
import java.util.ArrayList;
import java.util.Collections;
​
public class StreamDemo2 {public static void main(String[] args) {//1.创建集合ArrayList<String> list=new ArrayList<>();
​//2.利用集合的工具类(Collections)添加数据Collections.addAll(list,"a","b","c","d","e");
​//3.利用链式编程,forEach方法和Lambda表达式进行遍历list.stream().forEach(s -> System.out.println(s));//s:依次表示流水线上的每一个数据}
}

代码解读:

  • stream方法:

  • forEach方法(可用于遍历):该方法的形参是函数式接口,因此可以写成匿名内部类,再改写为Lambda表达式

b.双列集合无法直接使用stream流,需要先用keySet方法(获取所有的键)或entrySet方法(获取到所有键值对对象的单列集合)将其转换为单列集合,才能使用stream流:
获取stream流方法一:
package com.itheima.a01mystream;
​
import java.util.HashMap;
​
public class StreamDemo3 {public static void main(String[] args) {//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()获取到了所有的键,是一个单列集合(Set集合);hm.keySet().stream()代表把所有的键放到了stream流这个流水线上*/hm.keySet().stream().forEach(s -> System.out.println(s));}
}

获取stream流方法二:
package com.itheima.a01mystream;
​
import java.util.HashMap;
​
public class StreamDemo3 {public static void main(String[] args) {//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.entrySet().forEach(s-> System.out.println(s));//s依次表示键值对对象}
}

运行结果:

问题:添加数据的顺序和输出数据的顺序不一样,这是为什么?

因为HashMap集合底层是哈希表,它不能保证存和取的顺序一致,因此只要数据没错即可,顺序无所谓。

c.数组获取stream流:
存基本数据类型的数组获取stream流:
package com.itheima.a01mystream;
​
import java.util.Arrays;
​
public class StreamDemo4 {public static void main(String[] args) {//1.创建数组int[] arr={1,2,3,4,5,6,7,8,9,10};
​//2.获取stream流Arrays.stream(arr).forEach(s-> System.out.println(s));}
}
存引用数据类型的数组获取stream流:
package com.itheima.a01mystream;
​
import java.util.Arrays;
​
public class StreamDemo4 {public static void main(String[] args) {//1.创建数组String[] arr={"a","b","c"};
​//2.获取stream流Arrays.stream(arr).forEach(s-> System.out.println(s));}
}

代码解读:

1. 类Arrays里的stream方法:在类Arrays里,stream方法为静态的,可以直接类名.方法名进行调用

2.类Arrays里重载了许多stream方法:

当数组存引用数据类型时,会用上述图片中第一个stream方法来获取stream流。

d.一堆零散的数据获取stream流:这堆零散的数据必须是同种类型
方法of的形参是基本数据类型时:
package com.itheima.a01mystream;
​
import java.util.stream.Stream;
​
public class StreamDemo5 {public static void main(String[] args) {Stream.of(1,2,3,4,5).forEach(s-> System.out.println(s));}
}
​
方法of的形参是引用数据类型时:
package com.itheima.a01mystream;
​
import java.util.stream.Stream;
​
public class StreamDemo5 {public static void main(String[] args) {Stream.of("a","aa","aaa").forEach(s-> System.out.println(s));}
}

二.注意事项:

用接口Stream中的静态方法of获取stream流除了一堆零散的数据外可用,比如数组也是可以的,因为of方法的形参

属于可变参数(可变参数底层就是一个数组),例如:

package a41practice;
​
import java.util.stream.Stream;
​
public class Test {public static void main(String[] args) {//1.创建数组String[] arr2={"a","b","c"};
​//2.获取stream流Stream.of(arr2).forEach(s-> System.out.print(s+" "));/* 运行结果为a b c */}
}

但上述的方式是错误的,因为数组存的不仅仅有引用数据类型,还有基本数据类型,如下:

package a41practice;
​
import java.util.stream.Stream;
​
public class Test {public static void main(String[] args) {//1.创建数组int[] arr1={1,2,3,4,5,6,7,8,9,10};
​//2.获取stream流Stream.of(arr1).forEach(s-> System.out.print(s+" "));/* 运行结果为[I@7291c18f */}
}

此时无法做到遍历数据,打印出了地址值。

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

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

但数组存的数据必须是引用数据类型的,如果数组存基本数据类型,静态方法of是会把整个数组当成一个元素,放到

Stream流中,最后输出地址值,而不是数据。

相关文章:

Stream流的思想和获取Stream流

首先介绍流的概念&#xff1a; 流可以理解为一条流水线&#xff0c;在这条流水线中有许多操作&#xff0c;比如筛选所需要的数据&#xff0c;输出打印等&#xff0c; 经过这条流水线&#xff0c;可以获取到自己所需要的数据&#xff1a; -->所以&#xff1a; Stream流的作…...

go语言中的切片详解

1.概念 在Go语言中&#xff0c;切片&#xff08;Slice&#xff09;是一种基于数组的更高级的数据结构&#xff0c;它提供了一种灵活、动态的方式来处理序列数据。切片在Go中非常常用&#xff0c;因为它们可以动态地增长和缩小&#xff0c;这使得它们比固定大小的数组更加灵活。…...

ElK 8 收集 Nginx 日志

1. 说明 elk 版本&#xff1a;8.15.0 2. 启个 nginx 有 nginx 可以直接使用。我这里是在之前环境下 docker-compose.yml 中启动了个 nginx&#xff1a; nginx:restart: alwaysimage: nginx:1.26.1ports:- "80:80"- "443:443"volumes:#- ./nginx/html:/…...

Xv6驱动(四):CLINT

阅读材料 Xv6代码&#xff1a;memlayout.h、start.c、kernelvec.S教材5.4节 CLINT内存映射 实际上&#xff0c;CLINT还包括若干个MSIP寄存器&#xff0c;用来触发软件中断&#xff0c;但是在Xv6中不考虑软件中断&#xff0c;因此这些寄存器也不用考虑 // core local interr…...

【LInux】HTTPS是如何实现安全传输的

1. 客户端发起HTTPS连接请求 当浏览器请求一个HTTPS网址时&#xff0c;客户端&#xff08;例如浏览器&#xff09;会向服务器发起一个HTTPS请求。 2. 服务器返回数字证书 服务器收到请求后&#xff0c;会向客户端发送包含公钥的数字证书。数字证书由**权威认证机构&#xff…...

英飞凌PSoC4000T的GPIO中断示例工程

关于PSoC4000T的初步介绍见:英飞凌MCU第五代高性能CAPSENSE技术PSoC4000T_psoc 4000t-CSDN博客 下面这个工程,在modustoolbox中可编译、下载到开发板、debug调试。 编译时会用到mtb_shared这个库: 已经pdl这个periperal driver library库:...

物联网(IoT)中基于深度学习的入侵检测系统的综合综述

这篇论文是一篇全面的综述&#xff0c;标题为“A comprehensive survey on deep learning-based intrusion detection systems in Internet of Things (IoT)”&#xff0c;作者是Qasem Abu Al-Haija和Ayat Droos。论文主要探讨了在物联网(IoT)环境中基于深度学习的入侵检测系统…...

《成都体育学院学报》

投稿指南 成都体育学院学报属于体育类型期刊&#xff0c;由成都体育学院主办&#xff0c;国内统一刊号&#xff1a;51-1097/G8&#xff0c;国际标准刊号&#xff1a;1001-9154&#xff0c;双月&#xff0c;面向国内外公开发行。 一、来稿必须是作者独立取得的原创性学术研究成…...

Flask-JWT-Extended登录验证, 不用自定义

"""安装:pip install Flask-JWT-Extended创建对象 初始化与app绑定jwt JWTManager(app) # 初始化JWTManager设置 Cookie 的选项:除了设置 cookie 的名称和值之外&#xff0c;你还可以指定其他的选项&#xff0c;例如&#xff1a;过期时间 (max_age)&#xff1…...

rpm 与 yum

11 rpm -qa | grep openssh rpm与 yum CentOS仅删除软件包本身而不删除依赖 https://blog.csdn.net/kangshuaibi/article/details/125472204...

几种修改docker默认存储位置的方法

需求 docker容器存放目录磁盘空间满了&#xff0c;需要转移数据&#xff0c;修改Docker默认存储位置 解决方法 方法&#xff11;&#xff1a;迁移到新目录 停止docker服务。 1systemctl stop docker; //每个liunx版本的命令不一样。创建新的docker目录&#xff0c;执行命令df…...

istio中如何使用serviceentry引入外部服务

假设需要引入一个外部服务&#xff0c;外部服务ip为10.10.102.90&#xff0c;端口为32033. 引入到istio中后&#xff0c;我想通过域名gindemo.test.ch:9090来访问这个服务。 serviceentry yaml内容如下&#xff1a; apiVersion: networking.istio.io/v1beta1 kind: ServiceEn…...

模仿抖音用户ID加密ID的算法MB4E,提高自己平台ID安全性

先看抖音的格式 对ID加密的格式 MB4EENgLILJPeQKhJht-rjcc6y0ECMk_RGTceg6JBAA 需求是 同一个ID 比如 413884936367560 每次获取得到的加密ID都是不同的&#xff0c;最终解密的ID都是413884936367560 注意这是一个加密后可解密原文的方式&#xff0c;不是单向加密 那么如下进行…...

solidwork镜像实体

效果如下&#xff1a; 可以看到这两条线是对称的。 第一步&#xff0c;点击这条要镜像的边&#xff0c;接着点击镜像实体。 然后选择镜像轴&#xff0c;即可...

第6天:趋势轮动策略开发(年化18.8%,大小盘轮动加择时)

原创内容第655篇&#xff0c;专注量化投资、个人成长与财富自由。 轮动策略是一种投资策略&#xff0c;它涉及在不同的资产类别、行业或市场之间进行切换&#xff0c;以捕捉市场机会并优化投资组合的表现。 这种策略的核心在于识别并利用不同资产或市场的相对强弱&#xff0c…...

米客方德SD NAND 掉电测试

SD NAND 异常上下电测试的作用 SD NAND 异常上下电测试是一项关键的测试步骤&#xff0c;对确保SD NAND在不同电源条件下的稳定性和可靠性至关重要。 通过模拟正常和异常电源情况&#xff0c;测试可以验证设备的电源管理功能、检测潜在错误和异常行为&#xff0c;并评估设备在…...

深入探索Android开发之Kotlin核心技术学习大全

Android作为全球最流行的移动操作系统之一&#xff0c;其开发技能的需求日益增长。本文将为您介绍一套专为Android开发者设计的Kotlin核心技术学习资料&#xff0c;包括详细的学习大纲、PDF文档、源代码以及配套视频教程&#xff0c;帮助您从Kotlin基础到高级特性&#xff0c;再…...

langchain报错记录(js)

文章目录 [ERR_PACKAGE_PATH_NOT_EXPORTED]报错&#xff1a;报错语句&#xff1a;思路&#xff1a;解决方法&#xff1a; [ERR_PACKAGE_PATH_NOT_EXPORTED] 报错&#xff1a; Error [ERR_PACKAGE_PATH_NOT_EXPORTED]: Package subpath ‘./dist/prompts/’ is not defined by…...

VSCode调试Unity准备工作

一.Unity设置VSCode为默认编辑器 Unity编辑器中Edit-Preferences-External Tools中选择VSCode 二.VSCode安装Unity插件 三.Unity的Visual Studio Editor升至最新 Window->Package Manager->Visual Studio Editor 四.下载配置.Net 8.0 安装之前VSCode会提示你下载.Net …...

缓存穿透 问题(缓存空对象)

文章目录 1、缓存穿透2、缓存空对象3、AlbumInfoApiController --》getAlbumInfo()4、AlbumInfoServiceImpl --》getAlbumInfo()5、RedisConstant6、请求缓存不存在的数据 1、缓存穿透 2、缓存空对象 3、AlbumInfoApiController --》getAlbumInfo() GetMapping("getAlbumI…...

DISMTools企业部署:在组织中大规模应用的最佳实践

DISMTools企业部署&#xff1a;在组织中大规模应用的最佳实践 【免费下载链接】DISMTools The connected place for Windows system administration 项目地址: https://gitcode.com/GitHub_Trending/di/DISMTools DISMTools是一款专为Windows系统管理设计的连接平台&…...

Windows Cleaner深度解析:5大核心模块彻底解决系统空间不足问题

Windows Cleaner深度解析&#xff1a;5大核心模块彻底解决系统空间不足问题 【免费下载链接】WindowsCleaner Windows Cleaner——专治C盘爆红及各种不服&#xff01; 项目地址: https://gitcode.com/gh_mirrors/wi/WindowsCleaner Windows Cleaner是一款完全免费开源的…...

C++ vector容器总结

vector基本概念功能&#xff1a;vector数据结构和数组非常相似&#xff0c;也称为单端数组vector与普通数组区别&#xff1a;不同之处在于数组是静态空间&#xff0c;而vector可以动态扩展动态扩展&#xff1a;并不是在原空间之后续接新空间&#xff0c;而是找更大的内存空间&a…...

天文时序数据分析:机器学习评估、半监督学习与无监督方法实战

1. 项目概述&#xff1a;当机器学习遇见星空 处理海量的天文时序数据&#xff0c;比如来自Kepler、TESS这些“巡天巨眼”的光变曲线&#xff0c;早已不是靠人眼一张张图去翻的时代了。数据量太大&#xff0c;噪声复杂&#xff0c;信号微弱&#xff0c;传统方法常常力不从心。这…...

Taotoken用量看板功能详解,助你洞察团队AI资源消耗模式

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 Taotoken用量看板功能详解&#xff0c;助你洞察团队AI资源消耗模式 对于技术管理者或项目负责人而言&#xff0c;清晰了解团队的AI…...

Hermes Agent工具如何自定义接入Taotoken提供商

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 Hermes Agent工具如何自定义接入Taotoken提供商 Hermes Agent 是一款功能强大的AI智能体开发框架&#xff0c;它支持通过自定义提供…...

使用libusb-win32驱动复活老旧USB硬件:以Elektor Magic Eye为例

1. 项目概述&#xff1a;让老硬件在新时代焕发新生手头有一台十多年前的《Elektor》杂志上刊登的“Magic Eye EM84”复古VFD显示屏项目&#xff0c;想把它接到Windows 10电脑上当个酷炫的CPU占用率显示器&#xff0c;却发现官方提供的“AVR309”USB驱动在新系统上彻底罢工了。这…...

PostgreSQL Join 执行策略(Nested Loop、Hash Join、Merge Join)与 NOT EXISTS 优化

以集成数据压缩 SQL 优化为例&#xff0c;用大白话讲清楚 Nested Loop、Hash Join、Merge Join 三种执行策略。一、背景&#xff1a;一条慢 SQL 引发的思考 在对上游下发数据做压缩时&#xff0c;有这样一条 UPDATE SQL&#xff1a; -- ❌ 原始写法 UPDATE magellan_nk_order_i…...

3分钟终极指南:用ncmdump轻松解密网易云音乐NCM格式文件

3分钟终极指南&#xff1a;用ncmdump轻松解密网易云音乐NCM格式文件 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗&#xff1f;ncmdump正是解决这个问题的神器&…...

Windows键盘重映射终极指南:如何使用SharpKeys专业解决方案告别误触烦恼

Windows键盘重映射终极指南&#xff1a;如何使用SharpKeys专业解决方案告别误触烦恼 【免费下载链接】sharpkeys SharpKeys is a utility that manages a Registry key that allows Windows to remap one key to any other key. 项目地址: https://gitcode.com/gh_mirrors/sh…...