本文转载请联系码农小胖公众号。Java8的StreamAPI提供了许多可以替代Java集合框架的操作。但是,很多同学在学习和使用Stream的时候,还是一头雾水。他们不知道什么时候使用Stream,甚至不记得使用Stream。连Stream和集合框架的选择都成了问题。今天胖哥就想办法帮你解决这些问题。本文已经假设你已经开始使用Stream,你也可以通过本文开始使用。Stream的特点要想用好Stream,就必须了解它的特点。流不是数据结构。虽然我们将Stream与Collection所代表的集合帧类型进行比较,但它只是将数据源(Source)中的数据元素提取到数据操作管道中,并遵循定义好的规则(operator)进行“流”。另外,Stream永远不会修改它封装的底层数据结构的数据。Stream有点类似于水管网络。在无定尺寸的管网中流动的水没有定尺寸,甚至可以是无穷大。Streams也是如此。惰性Stream只有定义了终止操作才会开始执行,例如collect(Collector)和forEach(Consumer)。以下流中以h开头的过滤器字符串将不会被执行。Stream.of("hello","wolrd").filter(str->str.startsWith("h"))Invariance一个给定的Stream是不变的,所有的中间操作都会产生一个新的Stream,即使是中间操作也不会改变Stream中的任何元素。Stream一次只有一个终止操作。终止操作完成后,流将关闭。它不能再次使用,它只是一次性产品。StreamstringStream=Stream.of("1","2");//forEachterminateoperationprint12streamterminatestringStream.forEach(System.out::println);//重新使用会抛出IllegalStateException异常streamhasalreadybeenoperateduponorclosedstringStream.filter(s->s.equals("2")).forEach(System.out::println);并行操作Stream支持并行操作,无需编写额外的多线程代码,所有操作都会自动并行。但大多数时候我们是连续进行的。我们应该如何选择?Stream和Collection应该如何选择?首先,Collection的大部分场景都可以用Stream来完成,甚至更好。看API操作,都提供了很多方法。如果需要获取元素个数,集合比较方便。如果要过滤一些元素,显然Stream的API更方便,甚至还提供了各种可组合的操作。.查看初始化成本。对于集合,一旦定义和使用,需要一次性加载到内存中。如果打算在内存中复用这些数据,使用集合是非常合适的;以及Stream的惰性特性,在终端操作之前不会有中间操作,这意味着数据不会被初始化到内存,这样可以降低初始化成本,甚至可以调整它执行和消耗元素的速率.查看结果集的大小。如果最终的结果是可控的、有限的,那么他们两个都可以胜任;如果结果集非常大或接近无限,Stream将是最佳选择。是否改变原始数据Stream不会改变原始数据,而Collection可以实现这一点。是数据容器还是数据管道。我们需要重用对象实例吗?当结果以Collection的形式返回后,我们就可以复用了。一个Stream被使用后,就被认为是被消费了,再次使用时会抛出IllegalStateException,如上图。是否需要固定的格式Stream的表示格式通常没有Java集合框架丰富,提供了Set、List、Map等格式。如果需要终端返回显示,显然集合框架更合适。在SpringMVC中,流被表示为数组。综上所述,以上是使用这两个概念时需要考虑的几点。其实在大多数情况下,我们只需要看谁的API更友好,因为它们之间是可以相互转换的。显然,Stream更符合未来趋势。