java8可能是目前使用最为广泛的jdk版本。促使开发者升级的动力、以及不想升级更高等级的原因,无非是java8引入的优秀功能,其中一个便是stream。结合lambda表达式,stream可以简洁高效的处理集合数据。
创建stream
首先看一下如何创建一个stream对象
List<String> list = new ArrayList<>();
// 创建单线程处理stream
Stream<String> stream = list.stream();
// 创建可以并行处理的stream,一般不用
Stream<String> parallelStream = list.parallelStream();
对集合直接调用stream()
方法即可。该方法执行完成后,我们便得到了一个Stream对象。
该方法是Collection.java
接口中实现的默认方法。这样,所有的线性集合均可以创建Stream(Map并不支持直接创建Stream)。
default Spliterator<E> spliterator() {
return Spliterators.spliterator(this, 0);
}
default Stream<E> stream() {
return StreamSupport.stream(spliterator(), false);
}
default Stream<E> parallelStream() {
return StreamSupport.stream(spliterator(), true);
}
Spliterator
是java8引入的“可拆分迭代器”,类似Iterator
,可以用来遍历集合。但是Spliterator
可以用来并行遍历。具体实现以后再详细说明。
操作Stream中的元素
Stream
创建结束。下面是对这个集合中的元素进行处理。Stream
提供了多种处理方法,这些方法又分为以下两大类:
-
中间方法:方法执行完成后会返回一个新的
Stream
对象,stream处理不会结束。常用中间方法为ffilter
、map
、flatMap
、distinct
、sorted
、peek
、limit
、skip
等。 -
终结方法:方法执行完成后会返回一个对象/集合/其他结果,调用终结方法意味着本次stream处理结束。常用的终结方法有
forEach
、toArray
、redice
、collect
、min
、max
、