何时使用Java Stream,何时使用Java集合框架

开发 后端
Java 8 的Stream API 提供了不少可替代Java 集合框架的操作。但是不少同学在学习和使用Stream时依然感到很困惑,不知道何时使用Stream,甚至想不起来使用Stream,甚至在Stream和集合框架的选择上也成了问题。今天胖哥将尝试帮你解决这些疑问。

[[392376]]

本文转载自微信公众号「码农小胖哥」,作者码农小胖哥 。转载本文请联系码农小胖哥公众号。

Java 8 的Stream API 提供了不少可替代Java 集合框架的操作。但是不少同学在学习和使用Stream时依然感到很困惑,不知道何时使用Stream,甚至想不起来使用Stream,甚至在Stream和集合框架的选择上也成了问题。今天胖哥将尝试帮你解决这些疑问。

本文已经假设你入门过了Stream,你也可以通过这一篇来入门学习。

Stream的特点

如果你要用好Stream,你必须搞清楚它的特点。

Stream 并非数据结构

虽然我们把Stream和以Collection为代表的集合框架类型放在一起对比,但它只是将数据源(Source)中的数据元素提取到数据操作管道,并按照定义好的规则(操作符)进行“流动”。另外Stream也绝不修改自己所封装的底层数据结构的数据。

Stream有点类似于水管网络。

无固定大小

水管网络中流动的水是没有固定大小的,甚至可以是无限的。Stream也是如此。

惰性化

Stream只有定义终止操作,比如collect(Collector)、forEach(Consumer),它才会开始执行。以下从流中筛选以h开头的字符串并不会执行。

  1. Stream.of("hello","wolrd").filter(str-> str.startsWith("h")) 

不变性

一个既定的Stream是不变的,所有的中间操作都会衍生一个新的Stream,即使中间操作不改变Stream中的任何元素。

一次性

一个Stream流只有一次终止操作。一旦完成了终止操作,这个流就关闭了。无法再次进行使用,简直就是一次性用品。

  1. Stream<String> stringStream = Stream.of("1""2"); 
  2. // forEach 终止操作打印 1  2 流终止 
  3. stringStream.forEach(System.out::println); 
  4. // 重复使用将抛出IllegalStateException异常 stream has already been operated upon or closed 
  5. stringStream.filter(s -> s.equals("2")).forEach(System.out::println); 

并行操作

Stream支持并行化(parallel)操作,不需要编写额外的多线程代码,所有的操作会自动并行进行。不过大多数情况下我们都是串行执行。

我们该如何选择

对于Stream和Collection我们该如何选择呢?首先Collection的绝大部分场景Stream都可以完成,甚至更好。

看API操作

它们都提供了很多方法,如果你需要获取元素的个数,集合更加方便一些,如果你要过滤一些元素,很明显,Stream的API更加方便,甚至它提供了各种可组合的操作。

看初始化成本

对于集合,一旦定义使用需要一次性的加载入内存,如果你打算在内存中重用这些数据,使用集合就非常合适;而Stream的惰性特点,在终端操作之前不会有任何的中间操作,这意味着不会上来就初始化数据到内存,可以降低初始化成本,甚至你可以调整其执行消费元素的速率。

看结果集大小

如果最终的结果是可控的、有限的,它们两者都能够胜任;如果结果集非常庞大或者近似无限的,Stream将是不二之选。

是否改变原始数据

Stream不会改变原始的数据,而Collection可以实现这一点。

是要数据容器还是数据管道。

是否需要重用对象实例

当结果以Collection的形式返回时,我们可以重复使用。而一个Stream被使用后,就认为它已消耗掉,并在重用时抛出IllegalStateException,如上面所示。

是否需要固定的格式

Stream流的表现格式通常没有Java集合框架丰富,Java集合框架提供了如Set、List、Map等格式。如果你需要终端返回展现,显然集合框架更加合适。

在Spring MVC中,Stream的展现为数组。

总结

以上是在使用这两个概念需要考虑的几个点,其实大多数情况下,我们只需要看谁的API更加友好,因为它们之间可以相互转换。显而易见,Stream更加符合未来的趋势。

责任编辑:武晓燕 来源: 码农小胖哥
相关推荐

2020-10-21 14:54:02

RustGolang开发

2021-11-26 09:00:00

数据库数据集工具

2011-08-08 15:43:01

MySQL索引

2019-11-29 07:53:07

DNSTCP网络协议

2021-12-09 09:52:36

云原生安全工具云安全

2020-12-13 14:32:22

5GWi-Fi 6

2013-08-21 15:06:31

iOSself.

2012-02-08 11:01:53

HibernateJava

2024-08-01 10:10:24

MySQL场景搜索

2024-04-16 12:00:14

API系统

2011-04-15 17:07:13

Java

2020-10-10 10:20:11

云计算云安全技术

2021-04-25 15:06:16

微软虚拟桌面IT

2021-06-01 11:11:26

物联网互联网IoT

2018-12-12 09:59:47

微服务架构分布式系统

2024-10-07 08:49:25

2021-04-14 07:52:00

Vue 作用域插槽

2020-02-25 16:00:28

JavaScript数据技术

2023-11-10 12:55:00

消息代理事件代理

2024-06-25 15:00:01

点赞
收藏

51CTO技术栈公众号