什么是Stream? |
Stream是一些数据上的抽象视图。
举例来说,Stream可以是列表、文件中的每行数据,或者其他任意元素的序列的一个视图。Stream API提供了可以连续执行,或者并行执行的操作集合。
开发者需要记住的是Stream是一个高层的抽象,而不是一个数据结构。Stream不会存储你的数据。 Stream本身是懒惰的,只有使用到它们时才会开始计算。这使我们能够产生无数的数据流。
在Java8中,你能够像下面一样编写一个Stream来产生无数的唯一标识码。
public static void main(String[] args) {
Stream<String> uuidStream = Stream.generate(() -> UUID.randomUUID().toString());
}
在Stream的接口中,有很多像of、generate和iterate一样的静态工厂方法,它们可以用来创建Stream的实例。上面展示的generate方法以Supplier为参数。Supplier是一个函数式接口,用来描述一个不需要参数并返回一个值的函数。我们传递给generate方法一个供应者,那么当调用的时候,就能产生一个唯一标识码。
怎么用Stream? |
一个Stream表面上与一个集合很类似,允许你改变和获取数据,但实际上却有很大区别:
1、Stream自己不会存储元素。元素可能被存储在底层的集合中,或者根据需要产生出来。
2、Stream操作符不会改变源对象。相反,他们返回一个持有新结果的Stream。
3、Stream操作符可能是延迟执行的。意思是它们会等到需要结果的时候才执行。
Stream遵循“做什么,而不是怎么去做”的原则。只需要描述需要做什么,而不用考虑程序是怎样实现的。
Stream很像Iterator,单向,只能遍历一遍。但是Stream可以只通过一行代码就实现多线程的并行计算。
当使用Stream时,会有三个阶段:
1、创建一个Stream。
2、在一个或多个步骤中,将初始Stream转化到另一个Stream的中间操作。
3、使用一个终止操作来产生一个结果。该操作会强制他之前的延迟操作立即执行。在这之后,该Stream就不会在被使用了。
Stream的操作 |
中间操作包括:map (mapToInt, flatMap 等)、 filter、distinct、sorted、peek、limit、skip、parallel、sequential、unordered。
终止操作包括:forEach、forEachOrdered、toArray、reduce、collect、min、max、count、anyMatch、allMatch、noneMatch、findFirst、findAny、iterator。