(一) 创建Stream的四种方式
//1 通过Collection 系列集合的stream() 或parallelStream()
ArrayList strings = new ArrayList<>();
Stream stream = strings.stream();
//2 数组工具类
Person[] people=new Person[10];
Stream stream1 = Arrays.stream(people);
//3 Stream类中的静态方法of()
Stream aa = Stream.of(“aa”, “bb”, “cc”);
//4 创建无限流
// 迭代
Stream iterate = Stream.iterate(0, (x) -> x + 2);
// iterate.forEach(System.out::println);
// 生成
Stream.generate(Math::random).limit(10).forEach(System.out::println);
(二) Stream的中间操作
中间操作在触发终端操作之前不会做任何事,这种行为也被称为延迟加载;
filter: 接受Lambda,从流中排除某些元素
limit: 截断流,使元素不超过给定数量
skip(n) : 跳过元素,返回一个扔掉了前n个元素的流,若流中元素不足n个,则返回一个空流。与limit(n)互补
distinct: 筛选,通过流所生成元素的hashCode()和equals()去除重复元素 元素需要重写hashCode()
和equals()。
映射:map----接受Lambda,将元素转换成其它形式或提取信息。接收一个函数作为参数,该函数会被应用到每个元素上,并将其映射成一个新的元素。
flatMap----接受一个函数作为参数,将流中的每个值转换成另一个流,然后把所有流连接成一个流。
map()和 flatMap() 的区别类似与Collection的add()和 addAll(),一个是将流加入新的流中(套娃操作),一个是将流中的元素加入新的流中。
排序
sorted() ---- 自然排序(Comparable)操作元素实现Comparable接口
sorted(Comparator com) 定制排序 排序方法中重写comparator方法
(三) Stream的终端操作
查找与匹配
allMatch—检查是否匹配所有元素
anyMatch—检查是否至少匹配一个元素
noneMatch—检查是否没有匹配所有元素
findFirst—返回第一个元素
findAny—返回当前流中的任意元素
count–返回流中元素的总个数
max—返回流中最大值
min—返回流中最小值
归约
reduce(T identity, BinaryOperator) / reduce(BinaryOperator) ----可以将流中元素反复结合起来,得到一个值
收集
collect—将流转换为其它形式。接收一个Collector接口的实现,用于给Stream中的元素做汇总的方法。