【函数式编程实战】(四)流-Stream API原理解析

57 篇文章 52 订阅
订阅专栏
12 篇文章 33 订阅
订阅专栏

前言

📫作者简介小明Java问道之路,专注于研究计算机底层/Java/Liunx 内核,就职于大型金融公司后端高级工程师,擅长交易领域的高安全/可用/并发/性能的架构设计📫 

🏆CSDN专家博主/Java领域优质创作者、阿里云专家/签约博主、InfoQ签约博主、华为云专家、51CTO专家🏆
🔥 如果此文还不错的话,还请👍关注、点赞、收藏三连支持👍一下博主哦

本文导读

集合是java中使用最多的数据结构,我们如何处理大量元素就是个问题,多线程(线程池)+迭代器性能是还可以,但是太麻烦,也不利于开发和管理,并发的问题还要考虑,这个时候为了保证java的流行性,或者说为了不让java淘汰,在高版本搞出来 流(Stream)。

一、集合与流

集合是java中使用最多的数据结构,包括List、Map,面向对象编程更像是面向集合面向数据结构编程,当我们要处理大量元素的时候,往往会使用多线程,多线程还不能直接创建,要使用线程池创建,麻烦的一批(Java开发规范);

我们如何处理大量元素就是个问题,多线程(线程池)+迭代器性能是还可以,但是太麻烦,也不利于开发和管理,并发的问题还要考虑,这个时候为了保证java的流行性,或者说为了不让java淘汰,在高版本搞出来 流(Stream)。

流(Stream)是声明式处理集合的,我们可以把他当做一个高级的 迭代器+多线程容器,他不能简单理解为一个 流 数据结构,集合(List、Map)可以增删改查,虽然流可以实现诸如过滤、合并,分组等等操作,但是其元素是 按需计算,这其实是一种生产者-消费者模式,流就像一个 正在创建的集合,他会按要求变化后计算值。

下面三段代码,for循环遍历list + if、list转迭代器 + if、等同逻辑

        // for + if
        List<BigDecimal> orderAmt = new ArrayList<>();
        for (OrderInfo orderInfo : orderInfos) {
            if (orderInfo.getOrderAmt().compareTo(BigDecimal.ZERO) > 0) {
                orderAmt.add(orderInfo.getOrderAmt());
            }
        }

        // 迭代器 + if
        Iterator<OrderInfo> it = orderInfos.iterator();
        while (it.hasNext()) {
            OrderInfo orderInfo = it.next();
            if (orderInfo.getOrderAmt().compareTo(BigDecimal.ZERO) > 0) {
                orderAmt.add(orderInfo.getOrderAmt());
            }
        }

        // Stream流 + Lambda表达式
        List<BigDecimal> collect = orderInfos.stream()
                .filter(orderInfo -> orderInfo.getOrderAmt().compareTo(BigDecimal.ZERO) > 0)
                .map(orderInfo -> orderInfo.getOrderAmt()).collect(Collectors.toList());

二、什么是流

流是Java 高版本的API,是声明式处理集合的,声明式(简洁)就是说我想要做什么而不是如何实现,把他当做一个高级的 迭代器(可复合-灵活)+多线程容器(可并行-性能好)

要了解流是什么,还要了解他的定义、类路径、如何使用,以及一些使用规范

流在 java.util.stream.Stream 接口中定义,我们可以看到接口注释中有大量讲解,我们就根据这些注释学习流

我们看源码,该类里面有大量方法接口(就和集合一样),可以访问元素,但是集合是数据结构,所以他主要目的是使用特定算法和数据结构存储/访问元素;但流的目的是计算。Stream<T> 流的接收元素是泛型,流会使用一个数据源(这个数据源流不会改变顺序)

注释中说了,1、流是懒加载原则;仅当 端操作启动时才对源数据执行计算,并且仅在需要时消耗源元素;2、流不会改变原有的数据源;3、流只操作一次;4、可能会抛出 IllegalStateException;5、流不需要被关闭;6、流是内部迭代。详细论证我们放到下面

三、流的使用原则

流使用包括3件事,要有数据源来执行操作,要有一个链这个链试试中间操作的步骤,一个终端操作生成结果。下面代码会论证 这些原则以及上述原理

流只能遍历一次,且是按顺序遍历(流是按顺序遍历的,不会一个List都过滤完,才map,而是每个元素都是流水线执行的)

// 流是按顺序遍历的,不会一个List都过滤完,才map,而是每个元素都是流水线执行的
List<BigDecimal> collect = orderInfos.stream().filter(orderInfo -> {
    System.out.println("===filter" + orderInfo.getOrderAmt());
    return orderInfo.getOrderAmt().compareTo(BigDecimal.ZERO) > 0;
}).map(orderInfo -> {
    System.out.println("===map" + orderInfo.getOrderAmt());
    return orderInfo.getOrderAmt();
}).collect(Collectors.toList());
System.out.println(collect);

// 流只能操作一次,当再次使用的时候会报错IllegalStateException:operated upon or closed
Stream<BigDecimal> stream = collect.stream();
stream.forEach(System.out::print);
System.out.println("===========");
stream.forEach(System.out::print);

流, java.util.stream.Stream 接口中定义 很多方法,这些方法分为 两大类。filter、map、limit、forEach、peek 等,可以连成流水线;collect 触发流水线执行并关闭(终端操作)。我们把连接起来称为中间操作,关闭流的称为终端操作。一个流的使用原则就是要有数据源、中间操作、终端从操作

四、流的运行原理

为什么Stram流、Lamda表达式式写法又叫作函数式编程?一是调用手法像是函数一般,只须传入参数即可调用;二是Lamda实现方式为生出静态函数调用而成

下图执行步骤标号 1 2 3 4,那流是如何 解决 Stream流水线的?

Stream中用某种实例化后的PipelineHelper来代表Stage,将具有先后顺序的各个Stage连到一起,就构成了整个流水线。跟Stream相关类和接口的继承关系图示。 

上图中Head用于表示第一个Stage,即调用调用诸如Collection.stream()方法产生的Stage,很显然这个Stage里不包含任何操作;StatelessOp和StatefulOp分别表示无状态和有状态的Stage,对应于无状态和有状态的中间操作。 

下图中通过Collection.stream()方法得到Head也就是stg0,紧接着调用一系列的中间操作,不断产生新的Stream。这些Stream对象以双向链表的形式组织在一起,构成整个流水线,由于每个Stage都记录了前一个Stage和本次的操作以及回调函数,依靠这种结构就能建立起对数据源的所有操作。这就是Stream记录操作的方式。

小结

本文通过集合引出Stream流,主要讲解了流的基本概念、使用的原理,Stream流水线的运行原理。

flink实战--flink原理解析
阿华田的博客
09-30 2万+
Flink出现的背景 我们知道目前处理的主要行的计算引擎有,Storm,SparkStreaming。但是这个两个计算引擎都有自己的局限性。Storm实现了低延迟,但是目前还没有实现高吞吐,也不能在故障发生的时候准确的处理计算状态(将数据从一个事件保存到另一个事件的,这些保留下来的是数据较计算状态),同时也不能实现exactly-once。SparkStreaming通过微批处理方法............
flink实战--核心概念解析和应用
阿华田的博客
03-05 1679
简介 在flink原理解析中https://blog.csdn.net/aA518189/article/details/82908993,我们把flink的概念以及原理整体介绍了一遍,接下来这篇文章会具体的解析每个原理的具体实现和使用方式。 1.对齐(align) 首先谈到对齐,那一定是多处理。那对齐的是什么呢?其实对齐的是检查点中的Barri...
stream API实战
Java技术实践
08-06 134
/** * @Description: 题目:请按照给出数据,找出同时满足以下条件的用户,也即以下条件全部满足 * 偶数ID且年龄大于24且用户名转为大写且用户名字母倒排序 只输出一个用户名字 */ public class StreamDemo { public static void main(String[] args) { User u1 = new User(11, "a", 23); User u2 = new User(12, "b", 24
Java 8 Stream API原理解析以及常用方法“
最新发布
m0_64821020的博客
07-08 944
因为不存储数据,那么在中的数据完成处理后,需要将中的数据重新归集到新的集合里。那么我们发现,每当我们需要对集合中的元素进行操作的时候,总是需要进行循环、循环、再循环。,包含了一些人的名字,我们想要找出所有姓张名字,以及名字长度为3的。filter()过滤器:中间操作,需要一个断言接口函数,断言接口返回true,有参数,获取符合条件的元素。中间操作api:一个操作的中间链,对数据源的数据进行操作。终止操作api:一个终止操作,执行中间操作链,并产生结果,返回类型不再是Stream对象。
Java8新特性-Stream API实战
风暴计划
11-12 1122
Java8新特性之Stream API实战 目录 1、Stream概述 2、Stream的创建 3、Stream的使用 案例使用的员工类,这是后面案例中使用的员工类: 3.1 遍历、匹配(foreach、find、match) 3.2 筛选(filter) 3.3 聚合(max、min、count) 3.4 映射(map、flatMap) 3.5 归约(reduce)。map-reduce操作。 3.6 收集(collect) 3.6.1 归集(toList、toSet、toMap)
java8 StreamAPI(一) 基本概念以及创建方式
恶心的小达达
02-25 496
一、作用 Stream是一组用来处理数组、集合的API 二、Stream的特性 1:不是数据结构,没有内部存储 2:不支持索引访问 3:延迟计算 4:支持并行 5:很容易生成数组或集合(List,Set) 6:支持过滤,查找,转换,汇总,聚合等操作 三、Stream运行机制 1: Stream分为 源source,中间操作,终止操作 2:的源可以是一个数组、一个集合、一个生成器方法,一...
Stream API 的概述
weixin_45417821的博客
06-21 269
文章目录为什么要使用Stream API什么是 StreamStream 的操作三个步骤 Java8中有两大最为重要的改变。第一个是 Lambda 表达式;另外一个则是 Stream APIStream API ( java.util.stream) 把真正的函数式编程风格引入到Java中。这是目前为止对Java类库最好的补充,因为Stream API可以极大提供Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。 StreamJava8 中处理集合的关键抽象概念,它可以指定你希望对集
函数式编程实战】 CompletableFuture、反应式编程源码解析实战
JAVAQXQ的博客
07-29 394
同步就是a程序强依赖b程序,我必须等到你的回复或者执行完毕,才能做出下一步响应,类似于编程中程序被解释器(JVM)顺序执行一样(加载>验证>准备>解析>初始化);异步则相反,a程序不强依赖b程序,响应的时间也无所谓,无论你返回还是不返回,a程序都能继续运行,也就是说我不存在等待对方的概念,a程序就是异步非阻塞的。下面举一个例子就说明什么是同步、什么是异步反应式编程是最近几年才提出的概念,主要有个特征响应式,反应式编程的响应速度应该很快,而且是稳定可预测的。韧性。...
开放平台架构设计原理实战:如何设计开放API
AI天才研究院
11-01 459
开放平台(Open Platform)是指第三方合作伙伴提供服务的互联网应用或网络服务平台。作为一个平台,它与其他的基础设施和应用程序服务进行集成,并向用户提供基于开放协议的接口和服务,这些协议允许第三方访问、使用或者分享相关数据和资源。开放平台提供了一种“开放-包容-共赢”的服务模式,让更多的合作者参与到该平台中来,通过对平台的开放,可以释放更多的创新价值,并且也可以提升平台的整体竞争力。在互联网的蓬勃发展下,越来越多的企业希望拥有自己的平台,这就需要平台架构师对其中的设计和运营管理有更好的把握和理解。
2023年最新Flutter+Getx仿小米商城项目实战视频教程-V3版
luckysuny的博客
11-24 1931
透明导航 、浮动导航、导航动画、六格验证码、Photo-view类似朋友圈图片预览、3、 Flutter Android中使用生物识别认证的一些配置。2、 Flutter中使用socket.io和服务器实现通讯。3、 Flutter中使用socket.io和服务器实现通讯。直播程(推、拉)、借助腾讯云直播、自己搭建直播服务器、4、 Flutter Ios中使用生物识别认证的一些配置。二、 AP模式下Flutter和Wifi模块的数据穿透演示。、Flutter 事件驱动、Flutter本地存储。
Java 流式编程(Stream API)简介
u013558123的博客
02-28 836
Java 流式编程
java8的Stream api实战精辟解读
leeta的博客
08-05 125
文章目录 前言 1.Stream的概念: 1.1的构成: 1.2 Stream的生成方式: 2.1创建对象: 2.2单元测试进行应用: 2.3常用方法介绍: 3总结 前言 虽然java的jdk已经更新到了15,但是身边的大多数项目还是用的jdk8,java8稳定成熟足以可见。本篇来介绍java8比较酷炫的的Stream api,希望能帮助到学习java编程的朋友。 1.Stream的概念: Stream API是对容器对象功能的增强,专注于对容器对
流式API学习笔记
m0_72410588的博客
07-19 1028
流式API是一种编程接口,用于处理流式数据。它通过将输入数据划分为连续的数据,并逐个处理每个数据元素,从而实现对大规模数据的高效处理。与传统的批处理方式不同,流式API可以在数据产生的同时进行处理,具有实时性和高吞吐量的优势。
函数式编程-stream
HuiEr_h的博客
10-20 1157
函数式编程-stream
函数式编程-Stream
weixin_45415148的博客
06-06 189
Lambda是DK8中一个语法糖。可以看成是一种语法糖,他可以对某些匿名内部类的写法进行简化。它是函数式编程思想的一个重要体现。让我们不用关注是什么对象。而是更关注我们对数据进行了什么操作。java8的Stream使用的是函数式编程模式,如同它的名字一样,它可以被用来对集合或数组进行链状流式的操作。可以更方的让我们对集合或数组操作。我们在编写代码的时候出现最多的就是空指针异常。所以在很多情况下我们需要做各种非空的判断。if(author!=null){尤其是对象中的属性还是一个对象的情况下。
Java 8-stream实现原理分析(一)
pfjia的博客
03-07 9933
背景介绍 Spliterator和Iterator Iterator Spliterator 来源 实现方式 代码分析 Sink执行分析 filter的begin() map的begin() sorted的begin() filter的accpet() map的accpet() sorted的accpet() filter的end() map的end() sorted的end() Re...
Java8新特性-Stream的介绍与具体使用
有见寒舍
02-19 1343
Java8新特性-stream
Stream Api详解
qq_25073223的博客
07-08 6096
Stream api详解
深入理解Java Stream水线
weixin_30423977的博客
03-28 2332
前面我们已经学会如何使用Stream API,用起来真的很爽,但简洁的方法下面似乎隐藏着无尽的秘密,如此强大的API是如何实现的呢?Pipeline是怎么执行的,每次方法调用都会导致一次迭代吗?自动并行又是怎么做到的,线程个数是多少?本节我们学习Stream水线的原理,这是Stream实现的关键所在。 首先回顾一下容器执行Lambda表达式的方式,以ArrayList.forEach()方法为例...
写文章

热门文章

  • 已解决redis.clients.jedis.exceptions.JedisException: Could not get a resource from the pool异常的正确解决方法,亲测 158757
  • 【精通内核】计算机程序的本质、内存组成与ELF格式深度解析 147881
  • 【精通高并发】深入理解汇编语言基础(一) 130603
  • 耗时一个月我问遍了身边的大佬,零基础自学Java的路线,适用程序员入门&进阶,Java学习路线,2024新版 123995
  • 【面试精讲】MyBatis设计模式及源码分析,MyBatis设计模式实现原理 121238

分类专栏

  • Dubbo从入门到精通与实战 6篇
  • Redis从入门到精通与实战 21篇
  • 《MySQL从入门到精通与实战》 33篇
  • 《计算机底层原理》[更新中] 29篇
  • Linux内核源码解析 12篇
  • 深入理解计算机系统 12篇
  • 数据结构与企业题库精讲 44篇
  • 互联网架构分析与实战[更新中] 18篇
  • 《互联网企业防资损实践》 9篇
  • 《企业系统架构分析实践与落地》 6篇
  • Java全栈白宝书 57篇
  • 精通Java8与函数式编程 12篇
  • Java核心技术 16篇
  • 深入理解JVM 19篇
  • 深入理解高并发编程 28篇
  • Spring源码分析 10篇
  • 网络编程与Netty源码解析 2篇
  • MyBatis源码分析 5篇
  • 设计模式精讲 7篇
  • Bug解决大全 333篇
  • 程序人生 39篇
  • 项目实战 12篇

最新评论

  • 已解决java.lang.StackOverflowError异常的正确解决方法,亲测有效!!!

    多写文章能生发: 感谢,我报错是因为有别的同事调整了启动命令里面的JAM栈大小-Xss

  • 已解决java.lang.NoClassDefFoundError异常的正确解决方法,亲测有效!!!

    Renaissance_lyx: 感谢老哥

  • 「小明赠书活动」第六期解读Linux内存反向映射之匿名映射——《图解Linux内核(基于6.x)》

    发挥一次: 这是一篇高质量的好文,深度理解和清晰的表达方式使复杂的技术概念变得容易理解,值得收藏点赞。博主用心很有耐心,更有对知识的热忱和热爱,写了这么实用有效的分享,期盼博主能够光顾我的博客,给予宝贵的指导!

  • 已解决org.xml.sax.SAXNotRecognizedException异常的正确解决方法,亲测有效!!!

    YY的秘密代码小屋: 内容很赞,感谢博主分享

  • 已解决org.xml.sax.SAXNotRecognizedException异常的正确解决方法,亲测有效!!!

    九离十: 文章内容丰富,涵盖了很多实用的知识点,对我来说非常有帮助。尤其是博主在文章中提供了很多实际操作的步骤和技巧,让我能够更好地应用所学的知识。非常感谢博主的分享,期待博主能够继续输出这样优质的好文。

大家在看

  • Adobe Lightroom Classic (LRC) 软件win/mac下载、安装步骤与功能介绍
  • 鸿蒙网络编程系列33-TLS回声服务器示例
  • 赶紧收藏这篇Midjourney 提示词,你也能享受 AI 绘画的快乐
  • OpenCV学堂 | YOLOv8实战 | 荧光显微镜细胞图像检测
  • 韩即时通信巨头 Kakao 推出生成式 AI 助理 Kanana

最新文章

  • 已解决org.xml.sax.SAXNotRecognizedException异常的正确解决方法,亲测有效!!!
  • 已解决org.xml.sax.SAXException异常的正确解决方法,亲测有效!!!
  • 昇思25天学习打卡营第1天|快速入门
2024
08月 2篇
07月 10篇
06月 32篇
05月 23篇
04月 76篇
03月 84篇
02月 89篇
01月 69篇
2023年54篇
2022年101篇
2021年20篇
2020年48篇
2019年47篇
2018年2篇

目录

目录

评论 32
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小 明

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或 充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家百货商场美陈ppt汇报玻璃钢彩云雕塑福建环保玻璃钢雕塑多少钱延边玻璃钢仿铜麒麟雕塑黔西南商场美陈道具设计玻璃钢造型雕塑价格玻璃钢雕塑园林采购浚县玻璃钢雕塑加工厂家南宁佛像玻璃钢雕塑价位台湾玻璃钢雕塑价格汕头玻璃钢雕塑厂家天气冷怎么做玻璃钢雕塑的洛阳卡通玻璃钢雕塑厂家酒泉玻璃钢雕塑兰州卡通玻璃钢雕塑定制衡阳仿铜西式玻璃钢雕塑廊坊玻璃钢雕塑清洗房产玻璃钢雕塑珠海透明玻璃钢雕塑摆件好看的玻璃钢雕塑定制购物商场美陈黔南玻璃钢雕塑厂家琼海玻璃钢雕塑厂家玻璃钢雕塑用什么胶粘双鸭山玻璃钢雕塑制作厂家信阳标识标牌玻璃钢彩绘雕塑上海中庭商场美陈有哪些深圳坪山玻璃钢雕塑厂家湖州环保玻璃钢雕塑设计湖南玻璃钢海豚雕塑香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化