Stream作用就是在不改变源集合、数组条件下,对其中元素进行一顿操作得到想要的数据。
以下的Stream接口中方法其平行接口(红方框中的其他stream)均存在。
Stream创建方式
Stream中间操作
惰性求值:只有存在Stream终止操作时,才会执行中间操作
可能为空的则用Optional< T >接受
筛选与切片
注:下图中employees是个List
Stream filter(Predicate<? super T> predicate)
以某种条件过滤掉部分元素:
Stream limit(long maxSize)
取前maxSize个元素:
Stream skip(long n)
跳过前n个元素
Stream distinct()
去重(注意是用元素的HashCode和equals方法去重的)
映射
map(Function< T > mapper)【很重要】
返回对每个元素进行Function后转换为一种新元素形成的流:
flatMap(mapper)
类似于addAll,将每个元素变成的流的每个元素依次放入一个新流中。(并不是把每个元素变成的流直接放入新流中)
排序
查找与匹配
allMatch、anyMatch、noneMatch都是(Predicate<? super T> predicate)
Optional< T > findFirst()
Optional< T > findAny()
long count()
返回流中元素个数
Optional max(Comparator<? super T> comparator)
Optional min(Comparator<? super T> comparator)
要有比较才能知道大小嘛
归约 reduce()
收集 collect()终端操作
注意:
- Collector是java.util.stream下专门为stream提供的,与Collection没关系
- Collector方法都由工具类Collectors实现,所以直接用工具类Collectors中的方法
Collectors常用方法
对流中元素的部分属性的操作
一、返回集合
Object[] toArray()返回数组
二、平均、求和等基本操作
另一种方式: (对于集合元素中一特定属性)
三、分组(全都返回Map)
四、拼接
对数字操作流DoubleStream、IntStream、LongStream
常常 mapTo数据类型 将集合中的数字映射成 数字stream:
求和、平均、最大、最小等操作
/**
* 计算红色widgets的质量总和
**/
long sum = widgets.stream()
.filter(w -> w.getColor() == RED)
.mapToLong(w -> w.getWeight())//将Stream转换为LongStream
.parallel()
.sum();
并行流与顺序流(并行流就是Fork/Join框架)
顺序流就是单线程处理stream流
并行流是将stream流中数据划分成多个数据块处理(即划分成多个小的stream流),每个数据块将拥有一个线程 (底层就是Fork/Join框架)
parallel()方法: 将顺序流转换为并行流
sequential()方法: 将并行流转换为顺序流
计算0~1000亿的累加和:(CPU利用率高达100%)
java.util.Optional 防止空指针异常
用法:(防止new NewMan().getGodness().getName()可能发生空指针异常,可以用orElse(T t)判断一下)