一、Stream原理
1.使用Stream的基本步骤:
1)创建Stream
;
2)转换Stream
,每次转换原有Stream
对象不改变,返回一个新的Stream
对象,【可以有多次转换】
;
3)对Stream
进行聚合reduce
操作,获取想要的结果;
2.创建Stream的方式:
1)通过Stream接口的静态工厂方法
(注意:Java8里接口可以带静态方法);
a)of
:有两个overload方法,一个接受变长参数,一个接口单一值。
Stream<Integer> integerStream = Stream.of(1, 2, 3, 5);
b)generator
:生成一个无限长度的Stream,其元素的生成是通过给定的Supplier(这个接口可以看成一个对象的工厂,每次调用返回一个给定类型的对象),配合limit使用。
Stream.generate(Math::random).limit(10).forEach(System.out::println);
c)iterate
:也是生成无限长度的Stream,和generator不同的是,其元素的生成是重复对给定的种子值(seed)调用用户指定函数来生成的。其中包含的元素可以认为是:seed,f(seed),f(f(seed))无限循环。
Stream.iterate(1, item -> item + 1).limit(10).forEach(System.out::println);
2)通过Collection接口的默认方法(默认方法:default method,也是Java8中的一个新特性,就是接口中的一个带有实现的方法)。
3.转换Stream:
List<Integer> nums = Lists.newArrayList(1,1,null,2,3,4,null,5,6,7,8,9,10);
System.out.println(“sum is:” + nums.stream()
.filter(num -> num != null)
.distinct()
.mapToInt(num -> num * 2)
.peek(System.out::println)
.skip(2)
.limit(4)
.sum());
4.聚合(reduce):
reduce
二、两类操作
中间操作 | 终端操作 | ||
concat() | allMatch() | 判断条件里的元素,所有的都是,返回true | |
distinct() | 去除重复元素 | anyMatch() | 判断的条件里,任意一个元素成功,返回true |
filter() | 过滤 | collect() | 收集器 |
flatMap() | 合并两个Stream | count() | 计数 |
limit() | 返回一个不超过给定长度的流。 | findAny() | findAny方法将返回当前流中的任意元素。 |
map() | 对流中每一个元素应用函数 | findFirst() | 查找第一个元素 |
peek() | 打断点 | forEach() | 遍历 |
skip() | 返回一个扔掉了前n个元素的流。如果流中元素不足n个,则返回一个空流。 | forEachOrdered() | 顺序遍历 |
sorted() | 排序 | max() | 最大 |
parallel() | 并行 | min() | 最小 |
sequential() | noneMatch() | noneMatch跟allMatch相反,判断条件里的元素,所有的都不是,返回true | |
unordered() | reduce() | 聚合 | |
toArray() |