在对一个Stream进行多次中间操作时,由于转换操作具有延迟特性(多个转换操作只会在终端操作的时候融合起来,然后一次循环完成)。我们可以简单的这样理解,在Stream中有个操作函数的集合,每次转换操作的时候都会把转换函数放到这个集合中,在终端操作的时候循环Stream对应的集合,然后对每个元素执行所有的函数。
此外,有些中间操作和终端操作具有短路的特性。
即指对于一个中间操作而言,如果它接收的是一个无限大的流,但返回的是有限的新流。(如limt)
对于一个终端操作,如果它接受的是一个无限大的流,但能在有限的时间内计算出结果(如findFirst、findAny等)
3.Stream的使用
Stream的使用涉及到三点:
Stream的构建、Stream的转换、Stream的归约
1)Stream的构建:
最常用的创建Stream有两种途径:
a) 通过Stream接口的静态工厂方法(注意:Java8里接口可以带静态方法);
b) 通过Collection接口的默认方法--stream(),把一个Collection对象转换成Stream
Stream接口的静态工程方法
of方法
generate方法
iterate方法
Collection接口的默认方法:
stream()
2)Stream的转换:
Stream中转换需要了解的就是刚才前面提到的Stream的中间操作。
3)Stream的归约:
Stream中的归约的最基本的方法即前面提到的Stream的终端操作。
这边需要重点强调的就是collect方法。它可以接受各种做法作为参数,将流中的元素累积成一个汇总结构。具体的做法是通过定义一个新的Collector接口来定义的。
Collector类中具有很多的工厂方法,如前面使用过的toList方法,或是toSet、toCollection、counting、summingInt等。
根据不同的工厂方法,可以实现不同的归约操作。此外你还可以实现自定义收集器。