Stream是Java8中新加入的api,更准确的说:html
Java 8 中的 Stream 是对集合(Collection)对象功能的加强,它专一于对集合对象进行各类很是便利、高效的聚合操做,或者大批量数据操做 。Stream API 借助于一样新出现的 Lambda 表达式,极大的提升编程效率和程序可读性.
之前咱们处理复杂的数据只能经过各类for循环,不只不美观,并且时间长了之后可能本身都看不太明白之前的代码了,但有Stream之后,经过filter,map,limit等等方法就可使代码更加简洁而且更加语义化。java
流机器(动画来自 Tagir Valeev)编程
Stream的效果就像上图展现的它能够先把数据变成符合要求的样子(map),吃掉不须要的东西(filter)而后获得须要的东西(collect)。api
而关于如何使用,下面就用一个简单的例子来讲明。多线程
下面是一个简单的示例代码oracle
List<Dish> menu = ... List<String> lowCaloricDishesName = menu.stream() //筛选出卡路里大于400的 .filter(d -> d.getCalories() < 400) //抽取名字属性建立一个新的流 .map(Dish::getName) //这个流按List类型返回 .collect(toList());
在这段代码 filter 和 map 操做被称为中间操做,中间操做会返回一个新的流,而 collect 则被称为终端操做只有终端操做才会让整个流执行并关闭。也就是说 每一个流只能遍历一次 ,由于collect之后这个流就已经关闭了。性能
List<String> test = Arrays.asList("Java8", "In", "Action"); Stream<String> s = title.stream(); s.forEach(System.out::println); s.forEach(System.out::println); // 代码会抛出一个java.lang.IllegalStateException异常
想了解更多Stream的api能够查阅官方文档。优化
Stream能够分为串行与并行两种,串行流和并行流差异就是单线程和多线程的执行。动画
stream()和parallelStream()方法返回的都是java.util.stream.Stream<E>类型的对象,说明它们在功能的使用上是没差异的。惟一的差异就是单线程和多线程的执行。spa
记得之前正好看过一篇关于Stream的性能的文章,在此就直接引用结论了
结果能够总结以下:
1.对于简单操做,好比最简单的遍历,Stream串行API性能明显差于显示迭代,但并行的Stream API可以发挥多核特性。
2.对于复杂操做,Stream串行API性能能够和手动实现的效果匹敌,在并行执行时Stream API效果远超手动实现。因此,若是出于性能考虑,1. 对于简单操做推荐使用外部迭代手动实现,2. 对于复杂操做,推荐使用Stream API, 3. 在多核状况下,推荐使用并行Stream API来发挥多核优点,4.单核状况下不建议使用并行Stream API。
若是出于代码简洁性考虑,使用Stream API可以写出更短的代码。即便是从性能方面说,尽量的使用Stream API也另一个优点,那就是只要Java Stream类库作了升级优化,代码不用作任何修改就能享受到升级带来的好处。