JAVA 8 Streams API 学习札记

简介

近期在项目开发中,发现了java 8中一个非常重要的特性Stream,通过它可以很方便的对集合进行各类操作。 根据官方介绍,Stream 是对集合对象功能的增强,它专注于对集合对象进行各种非常便利、高效的聚合操作,或者大批量数据操作。另外由于集合类持有的元素都是存储在内存中,非常巨大的集合类会占用大量的内存,而Stream的元素却是在访问的时候才被计算出来,具有延迟计算的特性;另外Stream的迭代是隐含在对Stream的各种操作中。

程序示例

List<Integer> list = new ArrayList<>();
list.add(1);
list.add(3);
list.add(1);
list.add(5);
//返回一个List集合,集合中没有重复的元素
list.stream().map(it -> String.valueOf(it)).distinct().collect(collectors.toList());
//java 8之前
List<String> newList = new ArrayList<>();
for (Interger n: list) {
   String str = String.valueOf(n);
   if (!newList.contains(str)) {
       newList.add(str)
   }
}

由上面两段代码可知,Java 8使用Stream,代码更加简洁易读。另外Stream可以并行化操作,使用并行化遍历时,数据会被分成多个段,其中每一个都在不同的线程中处理,然后将结果一起处理。

Stream介绍

流的生成除了来自集合外,还可以通过某些静态方法来自动生成。通过使用流的时候,需要首先获取一个数据源,然后对数据进行操作或转换,最后获得想要的结果。类似于管道操作,前一次操作完后返回新的流对象供后面使用。流的操作类型分为三类:Intermediate, Terminal, short-circuiting.

Intermediate操作

一个流可以后面跟随零个或多个该操作,其目的主要是打开流,做出某种程度的数据映射/过滤,然后返回一个新的流,交给下一个操作使用。这类操作都是惰性化,仅调用到此方法,并没有真正的开始流的遍历。此类操作包括:map (mapToInt, flatMap 等)、 filter、 distinct、 sorted、 peek、 limit、 skip、 parallel、 sequential、 unordered

Terminal 操作

一个流只能有一个Terminal操作,当这个操作执行后,流就无法再被操作了。Terminal操作的执行,才会真正开始流的遍历,并且会生成一个结果。此类操作包括:forEach、 forEachOrdered、 toArray、 reduce、 collect、 min、 max、 count、 anyMatch、 allMatch、 noneMatch、 findFirst、 findAny、 iterator

Short-circuiting操作

该操作可以让一个无限大的Stream返回一个有限的新stream,另外对于一个terminal操作,对于一个无限大的stream,通过该操作可以在有限的时间计算出结果。此类操作包括:anyMatch、 allMatch、 noneMatch、 findFirst、 findAny、 limit

总结

Stream的可以很方便对集合进行操作,并且支持并发操作,可以很多好的适应多线程。并且stream操作是惰性化的。

参考文献

  1. Java 8 中的 Streams API 详解
  2. Java 8新特性:全新的Stream API

你可能感兴趣的:(java)