Stream流:
在java 8中,得益于lambda所带来的函数式编程,引入了一个全新的stream概念,用于解决已有集合类库既有的弊端
stream流的概念:stream流其实类似于工厂的“生产流水线”
stream流的特点:
1.stream流是单向的,不能重复使用
2.stream流是有延迟性的,每一个操作延迟方法之后会得到一个新的流,除了终结的方法
3.stream流也是不能存储数据的
4.stream流必须一定得搭建好模型,才能执行(也就是说一定要有终结的方法,才会执行)
5.stream流不会更改数据源
stream流使用: 获取流->调用延迟方法->调用终结方法
获取流:
-所有的collection集合都可以通过stream默认方法来获取流
-stream接口的静态方法of可以获取数组对应的流
常用方法:
终结方法:返回值类型不再是Stream接口自身类型的方法,因此不再支持类似StringBuilder那样的链式调用。终结方法包括count和forEach方法。
延迟方法:返回值类型仍然是Stream接口自身类型的方法,因此支持链式调用。(除了终结方法外,其余方法均为延迟方法。)
终结方法:
long count();统计个数
void forEach(consumer<? super T>action);该方法并不保证元素的逐一消费动作在流中是被有序执行的。---并发流中无法保证消费动作被有序执行---普通流可以保证有序执行
延迟方法:
过滤 filter:
stream<T> filter(predicate<? super T> predicate); 通过filter方法将一个流转换成另一个子集流
取用前几个 limit:
stream<T> limit(long maxsize);limit方法可以对流进行截取,只取用前n个
跳过前几个 skip:
Stream<T> skip(long n);如果希望跳过前几个元素,可以使用skip方法获取一个截取之后的新流
映射 map:
<R> stream<R> map(Function<? super T,? extends R> mapper);如果需要将流中的元素映射到另一个流中,可以使用map方法---就是将流中元素转换为另一种类型
组合 concat:
合并流!
如果有两个流,希望合并成为一个流,那么可以使用Stream接口的静态方法concat:
static <T> Stream<T> concat(Stream<? extends T> a, Stream<? extends T> b)
备注:这是一个静态方法,与java.lang.String当中的concat方法是不同的。