Java8之Stream流

目录

简介

特点

Stream操作步骤

创建

中间操作

筛选与切片

filter(Predicate p)

distinct()

limit(long maxSize)

skip(long n)

映射

map(Function f)

flatMap(Function f)

排序

自然排序

定制排序

终止操作

匹配与查找

归约

收集

好处

不足


简介

        在编写代码的过程中,我们经常要对集合或数组数据进行操作,而有了 Stream API,我们能够非常轻松的对集合、数据进行映射、过滤、查找等操作,使得我们能够像操作数据库一样的操作集合。

        Stream 本身并不存储元素,它并不改变源数据,每次操作都会形成一个新的流,并且只有执行了Stream的终止操作,中间的过滤、查找等操作才会执行。

        集合注重存储,Stream注重计算。集合是基于内存层面的,而Stream是基于CPU的。

特点

        高效率的并行操作

        多种功能的聚合操作

        函数式编程,代码更加简洁,提高编程效率

Stream操作步骤

        只有执行了终止操作,中间操作才会执行。这也是 Stream 的延迟执行的体现

创建

1.集合创建流

	@Testpublic void test() {List<String> list = new ArrayList<>();list.add("H");list.add("E");list.add("l");list.add("l");list.add("O");Stream<String> stream = list.stream();}

2.数组创建流

	@Testpublic void test() {Integer[] arr = {1,2,3,4,5,6,7,8,9};Stream<Integer> stream = Arrays.stream(arr);}

3.使用of方法创建流

	@Testpublic void test() {Stream<Integer> integerStream = Stream.of(1, 2, 3, 4, 5, 6);}

4.创建无限流

    @Testpublic void test() {// iteratorStream<Integer> iterate = Stream.iterate(0, ele -> ele + 2);iterate.forEach(System.out::println);}

中间操作

筛选与切片
filter(Predicate p)

接收断言型函数式接口,对流中的元素进行过滤

distinct()

对流进行去重

limit(long maxSize)

限制流中的元素数量。可以使用 limit方法来终止无限流

skip(long n)

跳过流中的 n 个元素

映射
map(Function f)

接收一个功能型函数式接口的实现类,该函数式接口中的抽象方法会被用到流中的每一个元素上

flatMap(Function f)

flatMap 的功能和 map 类似,都是将方法应用到流中的每个元素上

排序
自然排序

Stream< T > sorted(); 使用自然排序

定制排序

Stream< T > sorted(Comparator<? super T> comparator); 使用定制排序

终止操作

匹配与查找

    @Testpublic void test() {List<String> stringList = Arrays.asList("hello","world","hi","word");boolean b = stringList.stream().allMatch(str -> str.length() > 5);System.out.println(b); // false}
归约

 reduce 会遍历流中的元素

    @Testpublic void test() {List<String> stringList = Arrays.asList("hello","world","hi","word");String reduce1 = stringList.stream().reduce("", (s1, s2) -> String.valueOf(s1.length() + s2.length()));System.out.println(reduce1);List<Integer> integerList = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);// Optional 是 Java8 新增的防止空指针的类,通过 get() 方法可以获取到包装的值Optional<Integer> reduce2 = integerList.stream().reduce((i1, i2) -> {return i1 + i2;});System.out.println(reduce2.get());// 上述代码等同于下面代码Optional<Integer> reduce3 = integerList.stream().reduce(Integer::sum);System.out.println(reduce3.get());}
收集

收集在开发中也是非常实用的终止操作。常常用来对流进行中间操作最后收集生成集合

Collector 接口中方法的实现决定了如何对流执行收集的操作(如收集到 List、Set、Map)

好处

        1.它是java对集合操作的优化,相较于迭代器,使用Stream的速度非常快,并且它支持并行方式处理集合中的数据,默认情况能充分利用cpu的资源。同时支持函数式编程,代码非常简洁。

        2.Stream是一种用来计算数据的流,它本身并没有存储数据。你可以认为它是对数据源的一个映射或者视图这让我们使用起来方便简洁.

不足

        1.代码难以调试,因为不像for循环那样可以每一行打断点调试了

        2.在数据量不是很大的情况下,stream流是没有优势的,也就是说数据量小,且同意业务内多处使用stream处理数据,这时执行耗时比for循环更多,只有业务量达到百万级别才体现出优势。

        3.不要重复消费对象、不要修改数据源

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

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

相关文章

postgresql 内核源码分析 表锁relation lock的使用,session lock会话锁的应用场景,操作表不再困难

​专栏内容&#xff1a; postgresql内核源码分析 手写数据库toadb 并发编程 个人主页&#xff1a;我的主页 座右铭&#xff1a;天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物. 表锁介绍 当表打开&#xff0c;或者操作表时&#xff0c;都需要…

应用案例|探索高精度3D机器视觉在车间滑橇检测与测量中的应用

Part.1 应用行业 随着科技的不断进步&#xff0c;3D机器视觉技术逐渐成为了现实世界与数字世界之间的桥梁。3D机器视觉技术能使计算机感知和理解三维空间重的物体和场景&#xff0c;被广泛应用于机器人引导、工业检测等行业&#xff0c;例如&#xff1a;物流、电商、教育、医疗…

知识图谱推理的学习逻辑规则(上)

知识图谱推理的学习逻辑规则 摘要介绍相关工作模型知识图谱推理逻辑规则概率形式化参数化优化 实验实验设置实验结果 结论 原文&#xff1a; 摘要 本文研究了在知识图谱上进行推理的学习逻辑规则。 逻辑规则用于预测时提供了可解释性并且可以推广到其他任务中&#xff0c;因…

【Ceph集群应用】Ceph块存储之RBD接口详解

Ceph块存储之RBD接口详解 1.创建Ceph块存储系统RBD接口1.1 删除镜像1.2 还原镜像1.3 在线扩容1.4 回滚镜像到指定位置1.5 删除快照1.6 快照分层1.7 快照展平1.8 镜像的导出导入 接上文基于ceph-deploy部署Ceph集群详解 1.创建Ceph块存储系统RBD接口 &#xff08;1&#xff09;…

Godot实用代码-存取存档的程序设计

1. Settings.gd 全局变量 用于保存玩家设置 对应Settings.json 2. Data.gd 全局变量 用于保存玩具数据 对应Data.json 实践逻辑指南 1.在游戏开始的时候&#xff08;游戏场景入口的_ready()处&#xff0c; Settings.gd

【源码解析】Mybatis执行原理

Mybatis执行原理 1.获取SqlSessionFactory2.创建SqlSession3.创建Mapper、执行SQL MyBatis 是一款优秀的持久层框架&#xff0c;MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息&#xff0c;将接口和…

密码学学习笔记(十二):压缩函数 - Davies–Meyer结构

密码学中压缩函数是指将输入的任意长度消息压缩为固定长度输出的函数。压缩函数以两个特定长度的数据为输入&#xff0c;产生与其中一个输入大小相同的输出。简单来说就是它接受一些较长的数据&#xff0c;输出更短的数据。 压缩函数接收长度为X和Y的两个不同输入&#xff0c;并…

输入 jar cvf 后指令提示‘jar‘ 不是内部或外部命令,也不是可运行的程序

输入 jar cvf 后指令提示jar 不是内部或外部命令&#xff0c;也不是可运行的程序 一堆说jdk系统环境配置的文章&#xff0c;我都看哭了&#xff0c;还好有这位老兄拯救了我&#xff01;&#xff01;&#xff01;献上地址 https://www.cnblogs.com/wadezhou/p/16647474.html 我输…

[SQL系列] 从头开始学PostgreSQL Union Null 别名 触发器

初级的操作就是CRUD&#xff0c;但是高级的操作也是CRUD&#xff0c;只是语句写的更加复杂&#xff0c;不再是select * from table&#xff1b;这样简单&#xff0c;这次咱们学一些稍微高级点的。下面是上一篇文章。 [SQL系列] 从头开始学PostgreSQL 约束连接_Edward.W的博客-…

【Redis】高可用之三:集群(cluster)

本文是Redis系列第6篇&#xff0c;前5篇欢迎移步 【Redis】不卡壳的 Redis 学习之路&#xff1a;从十大数据类型开始入手_AQin1012的博客-CSDN博客关于Redis的数据类型&#xff0c;各个文章总有些小不同&#xff0c;我们这里讨论的是Redis 7.0&#xff0c;为确保准确&#xf…

字幕切分视频

Whisper 仓库地址&#xff1a; https://github.com/openai/whisper 可用模型信息&#xff1a; 测试视频&#xff1a;18段&#xff0c;总共447S视频&#xff08;11段前&#xff1a;有11段开头有停顿的视频&#xff09; Tiny: 跑完&#xff1a;142S &#xff0c;11段前&#xf…

在线乞讨系统 Docker一键部署

begger乞讨网 在线乞讨 全球要饭系统前端界面后端界面H2 数据库 console运行命令访问信息支付平台 在线乞讨 全球要饭系统 在线乞讨全球要饭项目,支持docker一键部署&#xff0c;支持企业微信通知&#xff0c;支持文案编辑 前端界面 后端界面 H2 数据库 console 运行命令 项…