Java - Stream流详解

2023-11-17

目录

前言

一、Stream流是什么?

二、流的分类

顺序流

并行流

区别

三.获取流的常用方式

1.通过集合获取流

2.通过数组获取流

3.通过Stream.of()方法获取流

四.常用方法用法

1.filter(Predicate predicate):过滤流中的元素,只保留符合条件的元素

2.limit  &&  skip

 3.distinct():去重,去除流中重复的元素。

 4.concat 合并a和b两个流为一个流

5. map(Function mapper):将流中的元素按照指定的方式进行映射,返回一个新的流,>

 6.forEach(Consumer action):对流中的每个元素执行指定的操作。

7.collect(Collector collector):将流中的元素收集到一个集合中。,>

 5.练习



前言

大家好,好久不见了,最近由于实训的影响导致拖更了,在更新这一次估计javaSE基本上就算是完结了,还有一些落下的后面也会补上的,下次见面就是数据结构了

尽情期待吧!那么就让我们步入Stream流的学习吧! 


一、Stream流是什么?

Stream流是Java 8中的一个新特性,它提供了一种处理集合和数组的方式。Stream流可以让我们以一种更加简洁、高效、可读性更强的方式来处理数据。Stream流可以用于过滤、映射、排序、聚合等操作,它可以让我们避免使用循环和条件语句来处理数据,从而让代码更加简洁易懂。Stream流的操作可以分为中间操作和终止操作两种类型,中间操作返回的是一个新的Stream流,终止操作返回的是一个非Stream类型的结果。Stream流的处理是惰性求值的,只有在执行终止操作时才会开始处理数据。

流(Stream)是一种基于支持一次性处理数据的数据源的元素序列,流只能使用一次。

流的设计初衷是为了支持函数式编程,它的目的是将数据处理和数据存储分离开来,使得数据处理更加灵活和高效。因此,流的元素只是在流中传递的临时数据,它们并不是永久存储在内存中的数据。当流的元素被消费后,它们就会被释放,不能再次使用.

如果需要对同一个数据集进行多次不同的操作,可以使用流的中间操作方法来构建多个流管道,每个流管道都可以对流进行不同的操作,并返回一个新的流。这样就可以对同一个数据集进行多次操作,而不需要重新获取数据集。

二、流的分类

顺序流

顺序流是一种单线程的流,它按照数据流的顺序依次处理每个元素,每个元素的处理都必须等待上一个元素的处理完成才能开始。

并行流

并行流是一种多线程的流,它可以将数据分成多个部分并行处理,每个部分都可以在不同的线程中处理,从而提高处理效率。

使用顺序流可以保证数据处理的顺序和一致性,适用于处理数据量较小的情况。而使用并行流可以提高数据处理的速度,适用于处理数据量较大、处理时间较长的情况。但是并行流也有一些缺点,比如线程之间的通信和同步会带来额外的开销,而且并行流可能会影响数据的顺序和一致性。因此在使用并行流时需要注意线程安全和数据一致性等问题。

区别

顺序流和并行流的区别在于它们的处理方式不同,顺序流是单线程的,而并行流是多线程的。使用的方法也有一些区别,例如:

  1. 获取顺序流:可以使用集合类的stream()方法、Arrays类的stream()方法、Stream类的of()方法、Stream类的iterate()方法、Stream类的generate()方法、Files类的lines()方法等来获取顺序流。

  2. 获取并行流:可以使用集合类的parallelStream()方法、Stream类的of()方法的parallel()方法、Stream类的iterate()方法的parallel()方法、Stream类的generate()方法的parallel()方法等来获取并行流。

除此之外,顺序流和并行流的使用方法基本相同,例如可以使用map()、filter()、reduce()等方法对流进行操作。但需要注意的是,在使用并行流时需要考虑线程安全和数据一致性等问题。

下面我只会详细讲解顺序流的使用,并行流的使用大差不差,大家有兴趣可以自行尝试

三.获取流的常用方式

前面提到过,流(Stream)是一种基于支持一次性处理数据的数据源的元素序列,流只能使用一次

所以将流保存起来没有任何意义,但是获取还是很有必要的,下面我会将常用的获取方式详解,不常用的也会给出获取方式,大家有兴趣的话可以自行尝试!

对了,我觉得有必要的是因为我现在的知识面不广,接触不到太复杂的内容,等回头成了大牛再来补

哈哈,其实不说的大部分是我不会,小黑子,漏出鸡脚了吧

1.通过集合获取流:可以使用集合类中的stream()方法或parallelStream()方法来获取流

2.通过数组获取流:可以使用Arrays类中的stream()方法来获取流。

3.通过Stream.of()方法获取流:可以使用Stream类中的of()方法来获取流。

4.通过Stream.iterate()方法获取流:可以使用Stream类中的iterate()方法来获取流

Stream<Integer> stream = Stream.iterate(0, n -> n + 2).limit(5); // 获取顺序流

5.通过Stream.generate()方法获取流:可以使用Stream类中的generate()方法来获取流

Stream<Double> stream = Stream.generate(Math::random).limit(5); // 获取顺序流

 6.通过Files.lines()方法获取流:可以使用Files类中的lines()方法来获取流。

Stream<String> stream = Files.lines(Paths.get("file.txt")); // 获取顺序流

1.通过集合获取流

 可变参数不懂得详见http://t.csdn.cn/SSp8u

 源码

 

 刚才看了一下,有点麻烦,先欠着吧

大家暂时知道获取的这个方法就行了

2.通过数组获取流

 源码

3.通过Stream.of()方法获取流

 

四.常用方法用法

  1. filter(Predicate<T> predicate):过滤流中的元素,只保留符合条件的元素。
  2. map(Function<T, R> mapper):将流中的元素按照指定的方式进行映射,返回一个新的流。
  3. flatMap(Function<T, Stream<R>> mapper):将流中的元素按照指定的方式进行映射,然后将所有映射结果合并成一个流。
  4. limit(long maxSize):截取流中的前maxSize个元素。
  5. skip(long n):跳过流中的前n个元素。
  6. sorted():对流中的元素进行排序。
  7. distinct():去重,去除流中重复的元素。
  8. forEach(Consumer<T> action):对流中的每个元素执行指定的操作。
  9. reduce(T identity, BinaryOperator<T> accumulator):将流中的元素按照指定的方式进行累加,返回一个Optional对象。
  10. collect(Collector<T, A, R> collector):将流中的元素收集到一个集合中。
  11. concat 合并a和b两个流为一个流

标红的不会进行讲解,有的是在我能力范围之外,当然了有两个,哈哈,主要是懒,不想了解

值得一提的是第六个排序好像可以指定排序规则,我去试试哈

确实可以哈

大家有兴趣可以试试,关于排序我之前的博文讲解的已经很透彻了,不再赘述

下面我只会简单演示一下,想要掌握的自己可以去练一下哈,到最后我会附上练习题和答案

1.filter(Predicate<T> predicate):过滤流中的元素,只保留符合条件的元素

2.limit  &&  skip

 3.distinct():去重,去除流中重复的元素。

 4.concat 合并a和b两个流为一个流

5. map(Function<T, R> mapper):将流中的元素按照指定的方式进行映射,返回一个新的流

 突然想到这个问题了,解释一下

 6.forEach(Consumer<T> action):对流中的每个元素执行指定的操作。

 就目前来看,我用的最多的是遍历

大家只要掌握遍历即可

7.collect(Collector<T, A, R> collector):将流中的元素收集到一个集合中。

 

 5.练习

0,过滤奇数,只留下偶数

ArrayList<Integer> list = new ArrayList<>();
Collections.addAll(list,1,2,3,4,5,6,7,8,9,10);

1,男演员只要名字为3个字的前两人
2,女演员只要姓杨的,并且不要第一个
3,把过滤后的男演员姓名和女演员姓名合并到一起
4,将上一步的演员信息封装成Actor对象。
5,将所有的演员对象都保存到List集合中。

备注:演员类Actor,属性有:name,age
男演员:  "蔡坤坤,24" , "叶齁咸,23", "刘不甜,22", "吴签,24", "谷嘉,30", "肖梁梁,27"
女演员:  "赵小颖,35" , "杨颖,36", "高元元,43", "张天天,31", "刘诗,35", "杨小幂,33"
        ArrayList<String> list1 = new ArrayList<>();
        ArrayList<String> list2 = new ArrayList<>();

        Collections.addAll(list1,"蔡坤坤,24" , "叶齁咸,23", "刘不甜,22", "吴签,24", "谷嘉,30", "肖梁梁,27");
        Collections.addAll(list2,"赵小颖,35" , "杨颖,36", "高元元,43", "张天天,31", "刘诗,35", "杨小幂,33");

        ArrayList<Integer> list = new ArrayList<>();
        Collections.addAll(list,1,2,3,4,5,6,7,8,9,10);

        // 0, 过滤奇数,只留下偶数

        List<Integer> collect = list.stream().filter(integer -> integer % 2 == 0).collect(Collectors.toList());

        System.out.println(collect);

        // 1,男演员只要名字为3个字的前两人

        Stream<String> stream1 = list1.stream().filter(s -> s.split(",")[0].length() == 3).limit(2);

        //  2,女演员只要姓杨的,并且不要第一个

        Stream<String> stream2 = list2.stream().filter(s -> s.startsWith("杨")).skip(1);

        // 3,把过滤后的男演员姓名和女演员姓名合并到一起

        //Stream.concat(stream1,stream2).forEach(s-> System.out.println(s));

        // 4,将上一步的演员信息封装成Actor 对象

        // 类型转换 String-> Actor
        Stream.concat(stream1, stream2).map(new Function<String, Actor>() {
            @Override
            public Actor apply(String s) {
                Actor actor = new Actor();

                actor.setName(s.split(",")[0]);

                actor.setAge(Integer.parseInt(s.split(",")[1]));

                return actor;
            }
        }).forEach(s-> System.out.println(s.getName()+" "+s.getAge()));

        // 5,将所有的演员对象都保存到List集合中。
        List<Actor> list3 = Stream.concat(stream1, stream2).map(s -> new Actor(s.split(",")[0], Integer.parseInt(s.split(",")[1])))
                .collect(Collectors.toList());

        System.out.println(list3);

总结

今天就说到这吧,大家记得做练习哈

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java - Stream流详解 的相关文章

随机推荐

  • Spring源码:PropertyValues类及属性注入一

    概要 相关类 属性注入 概要 Spring获取Bean的实例时 需要把配置的属性值解析到PropertyValues 然后填充入BeanWrapper中 相关类 MutablePropertyValues类 PropertyValues接口
  • http://www.limodev.cn/blog/archives/category/gtk

    The linux mobile development gt http www limodev cn blog 致力于基于linux的嵌入式系统的学习和研究 包括内核 驱动 GUI MMI 软件设计和优化等 欢迎交换友情链接 代码请到Pr
  • Docker实战-NFS安装

    Docker安装 1 使用官方安装脚本自动安装 curl fsSL https get docker com bash s docker mirror Aliyun 2 启动 Docker 服务 systemctl start docker
  • Struts2框架详解(二)

    Struts2结果页面配置 全局结果页面 场景 多个action 有相同的方法返回值 且都到同一个结果页面 需求 创建两个action 执行默认的方法execute方法 让两个action的方法都返回success 返回success之后
  • Nerf 训练自有数据

    1 拍摄序列图像 放置在文件夹 如duck images 2 使用colmap使用COLMAP获取相机位姿 1 参考官方文档安装colmap 2 使用win 可执行程序 3 点击 File 选择 new project 点击 New 在du
  • 强化学习实现智能城市规划,清华团队最新成果登Nature子刊

    由于城市地理空间的多样性和巨大的动作空间 给城市布局用地和道路是一件非常复杂而困难的任务 长久以来一直依靠人类规划师的经验和直觉 如今 城市规划领域也有了自己的AlphaGo 近日 清华大学电子系城市科学与计算研究中心与建筑学院跨学科合作
  • eip系统服务器,eip系统

    本词条缺少概述图 补充相关内容使词条更完整 还能快速升级 赶紧来编辑吧 eip系统是以数据为基础 应用为核心 以实现业务及业务流程的自动化为目的多功能企业信息平台 中文名 eip系统 基 础 数据性 质 多功能企业信息平台 方 法 把不同系
  • 二货小易有一个W*H的网格盒子 JAVA

    import java util public class Main public static void main String args Scanner sc new Scanner System in int w sc nextInt
  • VS2017调试unity没有解决方案

    1 VS2017之前的版本调试unity 需要下载 Visual Studio Tools for Unity 2 VS2017内置了Visual Studio Tools for Unity 3 首先打开 帮助 gt 关于 已安装程序中查
  • 法研杯参赛总结:“抽取-生成”式长文本摘要

    PaperWeekly 原创 作者 苏剑林 单位 追一科技 研究方向 NLP 神经网络 法研杯 1 算是近年来比较知名的 NLP 赛事之一 今年是第三届 包含四个赛道 其中有一个 司法摘要 赛道引起了我们的兴趣 经过了解 这是面向法律领域裁
  • 单片机IO引脚驱动能力的提高

    这篇文字学到不少东西 包括文中链接 在此感谢坐而论道 现摘录如下 早期的51单片机 驱动能力很低 P1 P2和P3口只能驱动3个LSTTL输入端 P0口可驱动8个 如果想要驱动更多的器件 就要用到 总线驱动芯片 经常用的就是74LS244
  • html登录页面

    效果图 html代码 index html
  • Java多线程练习--取钱

    1 需求 小明和小红是一对夫妻 他们有一个共同的账户 余额是10万元 模拟2人同时去取钱10万 分析 1 需要提供一个账户类 创建一个账户对象代表2个人的共享账户 2 需要定义一个线程类 线程类可以处理账户对象 3 创建2个线程对象 传入同
  • 浅析GPT2中的autoregressive和BERT的autoencoding源码实现

    经常使用BERT来做研究 因此对Encoder的架构较为熟悉 但是从来没有了解过GPT这样的Decoder架构 尤其对自回归的形式不知道源码是如何实现的 为了方便对比和讨论 接来下所探讨的源码都是基于HuggingFace这个框架的 Ber
  • 数据结构--基础之顺序表的一种实现(堆实现)基于C++语言。Sqlite(初始化,增,删,查,定,判,打印,求长,销毁)

    Mr lei 来人 上代码 好的 Title 顺序表 WorkSpace C 环境下的实现 Date 2023 4 12 Author Mr Lei Copyright 版权所有 侵权不究 QQ 2223696890 include
  • DDR的VTT有源端接和无源端接(slua886a笔记)

    DDR的VTT有源端接和无源端接 slua886a笔记 背景 对于DDR的VTT端接 一直有说法是有源端接可降低功耗 之前一直没仔细理解其中原因 现在找了些相关的资料来介绍和对比有源和无源端接 理解有源端接的优点和降低功耗的原理 主要基于读
  • 微信小程序之模版的使用(template)

    WXML提供模板 template 可以在模板中定义代码片段 然后在不同的地方调用 分为两部分 定义模板和使用模板 1 定义模板 使用 name 属性 作为模板的名字 然后在
  • python散点图圆形区域_python – Matplotlib;散点图标记,圆内点

    我正在使用Matplotlib散点绘图仪进行绘图 对于标记 我理想地喜欢内部有圆点的圆形轮廓 外圆圈清楚地表明那里有东西 然后点更精确 我可以实现这个 如果我只是绘制两次 一次用轮廓然后再用点 但那时我的传说是不正确的 所以我的问题是 有什
  • 划分训练集、验证集和测试集代码

    输入需要划分的数据所在的文件夹 返回一个划分好的包含train val和test的文件夹 val ratio 和test ratio分别为验证集和测试集所占的比例 test ratio 0表示不划分测试集 import os import
  • Java - Stream流详解

    目录 前言 一 Stream流是什么 二 流的分类 顺序流 并行流 区别 三 获取流的常用方式 1 通过集合获取流 2 通过数组获取流 3 通过Stream of 方法获取流 四 常用方法用法 1 filter Predicate pred