### Stream(惰性求值)
Collection 是一种静态的内存数据结构,而 Stream 是有关计算的。前者是主要面向内存,存储在内存中,后者主要是面向 CPU,通过 CPU 实现计算。
集合讲的是数据,流讲的是计算。
**注意点**
1. Stream 自己不会存储元素。
2. Stream 不会改变源对象 相反 它会返回一个持有结果的新的Stream。
3. Stream 操作是延迟的 只有在需要结果的情况下才会执行一系列的流操作。
## Stream操作
### 1. Stream 创建
1. list.stream() or list.parallelStream()
2. Arrays.stream(new Integer[10]) 数组流
3. Stream.of(1,2,3) 通过of方法
4. IntStream Stream.iterate(1,t->t+1) 无限流
### 2. Stream 中间操作
#### filter筛选=过滤
list.stream().filter(e->e.getAge>35).forEach(System.out::println)
#### limit切片
list.stream().filter(e->e.getAge>35).limit(3).forEach(System.out::println)
#### skip
跳过前面n个元素 与limit互补、
list.stream().skip(3).forEach(System.out::print);
#### distinct去重
通过hashcode和equals进行去重的。
list.stream().distinct().forEach(System.out::print);
#### Map flatMap映射
Map将流中的的元素经过处理转换成别的元素 成为一个新的Stream。
flatMap接受一个函数作为参数 将流中的每一个值都换成另一个流 然后把所有的流连接成一个新的流。
Map和flatMap处理返回一个流的函数的时候类似于add和addAll
list.map(Car::getName).forEach(System.out::println)
#### sort排序
1. 自然排序 sorted()--自然排序(Comparable)
2. 定制排序 sorted(Comparator com)
list.stream().sorted((x, y) -> -Integer.compare(x, y)).forEach(System.out::println);
### 3. 终止操作
1. allMatch 检查是否匹配所有元素
2. anyMatch 检查是否至少匹配一个元素
3. noneMatch 检查是否没有匹配的元素
4. findFirst 返回第一个元素
5. findAny 返回当前流中的任意元素
6. count 返回流中元素的总个数
7. max 返回流中最大值
8. min 返回流中最小值
#### 9. reduce 归约
将流中元素反复结合起来 生成一个新的值(就是对流中元素进行累加求值)。
list.stream().reduce(0, Integer::sum);//第一个参数为起始值 后面一次运用前一次生成的值和当前的值累加起来。
Optional<Integer> sum = list.stream().reduce(Integer::sum);
#### 10.collect收集
将一种流转换为其他的形式。接收一个Collector接口的实现,用于给Streamz中元素做汇总的方法。
collect方法接收一个Collector的接口,但是Collectors实用类提供了很多的静态方法,可以方便的创建常见收集器实例。
```java
// 收集
cars.stream().map(Car::getName)
.collect(Collectors.toList());
// 求平均值
cars.stream()
.collect(Collectors.averagingDouble(Car::getAge));
// 分组
Map<Integer, List<Car>> map = cars.stream()
.collect(Collectors.groupingBy(Car::getId));
// 多级分组
cars.stream()
.collect(Collectors.groupingBy(
Car::getId,
Collectors.groupingBy(Car::getName)
));
// 分区 true为一部分 false为一部分
Map<Boolean, List<Car>> maps = cars.stream()
.collect(Collectors.partitioningBy(t -> t.getAge() > 30));
```