Stream流的思想和获取Stream流

news2024/9/20 14:54:01

首先介绍的概念:

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

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

-->所以:

  • 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>() {
            @Override
            public 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流中,最后输出地址值,而不是数据。

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

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

相关文章

GEE 按范围导出 Sentinel-2 卫星影像

Sentinel-2 卫星提供了高分辨率的地表覆盖图像&#xff0c;广泛应用于农业监测、城市规划、环境变化分析等诸多领域。在 Google Earth Engine (GEE) 中&#xff0c;我们能够按特定地理范围导出这些影像&#xff0c;以支持更深入的研究和分析。 使用方法 &#x1f4bb; GEE 提供…

汽车租赁系统1.0版本

汽车租赁系统1.0版本比较简陋&#xff0c;以后还会有2.0、3.0……就像《我爱发明》里面的一代机器二代机器&#xff0c;三代机器一样&#xff0c;是一个迭代更新的过程&#xff08;最近比较忙&#xff0c;可能会很久&#xff09;&#xff0c;这个1.0版本很简陋&#xff0c;也请…

Visual Studio Code 高效开发 C/C++ 插件推荐

Visual Studio Code 高效开发插件 C/C 由 Microsoft 提供的官方插件&#xff0c;支持语法高亮、智能感知、调试等功能&#xff0c;是 C/C 开发的基础插件。 C/C Themes 由 Microsoft 提供的官方主题插件&#xff0c;它旨在增强 C 和 C 代码的编辑体验&#xff0c;通过提供代码…

性能诊断的方法(五):架构和业务诊断

关于性能诊断的方法&#xff0c;我们可以按照“问题现象—直接原因—问题根源”这样一个思路去归纳。我们先从问题的现象去入手&#xff0c;包括时间的分析、资源的分析和异常信息的分析。接下来再去分析产生问题现象的直接原因是什么&#xff0c;这里我们归纳了自上而下的资源…

江协科技STM32学习- P13 TIM定时器中断

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是黄桃罐头&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​…

ESP32开发 -- VSCODE+PlatformIO环境安装

参看官网安装&#xff1a;PlatformIO IDE for VSCode 一、安装PlatformIO IDE 参看&#xff1a;日常生活小技巧 – Visual Studio Code 简单使用 扩展中搜索platformIO IDE 当安装完提示重启之后。 打开一个要创建新工程的文件夹&#xff1a; 点击 Create New Project&…

10大差异!Linux运维VS云计算运维深度解析

在当今这个信息技术飞速发展的时代&#xff0c;云计算与容器化技术已经变得无处不在。 随着这些技术的广泛应用&#xff0c;企业对于如何高效、稳定地运维自己的系统和服务提出了更高的要求。 Linux运维和云计算运维作为两种不同的运维模式&#xff0c;它们各自在技术实现、管…

AI问答-HTTP:理解 Content-Disposition

一、简介 Content-Disposition是HTTP协议中的一个响应头字段&#xff0c;它主要用于指示如何处理响应的内容以及如何呈现给用户。这个字段是MIME协议类型的扩展&#xff0c;用于指导MIME用户代理&#xff08;如浏览器&#xff09;如何显示附加的文件。Content-Disposition的主…

vscode 设置

code runner设置运行代码弹出运行窗口 要让VSCode在输cmd窗口&#xff0c;可以按照以下步骤进行设置&#xff1a; 1. 打开VSCode并进入”文件”->”首选项”->”设置”&#xff0c;或者使用快捷键Ctrl ,。 2. 在设置页面的搜索栏中输入”External Terminal”&#xf…

【油猴脚本】00006 案例 Tampermonkey油猴脚本自定义表格列名称,自定义表格表头,自定义表格的thead里的td

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 【油…

数据结构::堆

堆的定义及解释 专业定义&#xff1a; 如果有一个关键码的集合K { &#xff0c; &#xff0c; &#xff0c;…&#xff0c; }&#xff0c;把它的所有元素按完全二叉树的顺序存储方式存储 在一个一维数组中&#xff0c;并满足&#xff1a; < 且 < ( > 且 > ) i 0…

Linux内核编译并移植至ARM平台

Linux内核编译并移植至ARM平台 Linux系统相关概念操作系统的启动过程获取树莓派源码Linux内核源代码目录树结构 树莓派Linux源码配置树莓派Linux内核编译移植内核至树莓派 Linux系统相关概念 操作系统的启动过程 x86&#xff0c;Intel的启动过程&#xff1a; 电源上电 -> B…

基于scRNA-data,运用pySCENIC寻找细胞群里面活跃的调节子

愿武艺晴小朋友一定得每天都开心 pySCENIC 在步骤上&#xff0c;分为4大步&#xff1a; 1&#xff09;准备工作&#xff1a;counts矩阵文件&#xff08;R语言写出csv文件&#xff09; 2&#xff09;将csv文件转换为loom文件(用python做) 3&#xff09;然后slurm平台申请资源…

概述03 A/B test

分层实验&#xff1a;

Python 课程9-資料庫操作

前言 在现代软件开发中&#xff0c;数据库是核心组件之一&#xff0c;它负责数据的存储、管理和检索。无论是简单的应用程序还是复杂的企业级系统&#xff0c;数据库操作都是必不可少的。本教程将深入讲解如何使用 Python 进行数据库操作&#xff0c;涵盖使用 sqlite3 进行本地…

Autosar学习----AUTOSAR_SWS_BSWGeneral(四)

General Implementation Specification 7.1 General Implementation Specification7.1.1 遵循 MISRA C 和 C 标准7.1.2 遵循 AUTOSAR 基本软件需求7.1.3 遵循 AUTOSAR 方法论7.1.4 平台独立性和编译器抽象7.1.5 可配置性7.1.6 各种命名约定7.1.7 配置参数7.1.8 共享代码7.1.9 全…

论文写作难?用这套ChatGPT提示词3小时完成论文初稿!

AIPaperGPT&#xff0c;论文写作神器~ https://www.aipapergpt.com/ 还在因为写论文头秃吗&#xff1f;你不是一个人&#xff01;从选题到文献综述&#xff0c;再到最后的结论&#xff0c;每一步都让人抓狂。选题纠结、文献多到看不过来、结构怎么写都不满意——这些是不是让你…

AI 加持的云端 IDE——三种方法高效开发前后端聊天交互功能

以下是「豆包 MarsCode 体验官」优秀文章&#xff0c;作者努力的小雨。 豆包 MarsCode 豆包MarsCode 编程助手支持的 IDE: 支持 Visual Studio Code 1.67.0 及以上版本&#xff0c;以及 JetBrains 系列 IDE&#xff0c;如 IntelliJ IDEA、Pycharm 等&#xff0c;版本要求为 22…

C++八股文基础知识点

1.指针和引用的区别 指针是一个指向内存地址的变量&#xff0c;其本身是一个地址&#xff0c;地址保存的是变量的值&#xff0c;而且它本身可变&#xff0c;包括它指向的地址和地址上的存放的数据&#xff1b;引用即为一个变量的地址&#xff0c;也是变量的别名&#xff0c;和…

opeGauss 之BitmapOr算子代码走读

一. 前言 在openGauss中&#xff0c;BitmapOr算子扫描是指谓词条件是索引列的or条件时&#xff0c;将多个or条件的索引谓词先组成一个需要扫描元组的BitmapOr扫描算子&#xff0c;然后再通过BitmapOr算子的tid信息去扫描元组&#xff0c;从而减少or条件带来的随机扫描过多的问题…