这是一种流式惰性计算,整体过程是:
stream的使用也异常方便,可以对比如List、Set之类的对象进行流式计算,挑出最终想要的结果:
List<Timestamp> laterTimes = allRecords.stream()
.map(Record::getTime)
.filter(createdTime -> createdTime.compareTo(threshold) > 0)
.distinct()
.sorted()
.limit(100)
.collect(Collectors.toList());
看起来好像是一个个方法顺序对所有的操作(map、filter、distinct。。。)执行,实际上不是,因为效率上是无法接受的,其基本思想是在一次迭代中尽可能多的执行用户指定的操作。
Stream上的所有操作分为两类:
- 中间操作只是一种标记,只有结束操作才会触发实际计算(也就是惰性计算,一个Stream转换为另一个Stream时,实际上只存储了转换规则,并没有任何计算发生)。中间操作又可以分为无状态的(Stateless)和有状态的(Stateful)
- 无状态中间操作是指元素的处理不受前面元素的影响
- 有状态的中间操作必须等到所有元素处理之后才知道最终结果,比如排序是有状态操作,在读取所有元素之前并不能确定排序结果
- 结束操作又可以分为短路操作和非短路操作
- 短路操作是指不用处理全部元素就可以返回结果,比如找到第一个满足条件的元素
- 非短路操作就是得处理所有元素才行
最终的结果肯定也是要接收的,咋接收的呢,你想想既然list、map之类的能转换为stream,那stream肯定也能转换为list、map之类的东西:
List<String> listResult = list.stream().collect(Collectors.toList());
Map<String, Integer> mapResult = list.stream()
.collect(Collectors.toMap(Function.identity(), String::length));