- 转换成其他集合
- groupingBy
- groupingByConcurrent
- partitioningBy
- averagingDouble
- averagingInt
- averagingLong
- summarizingInt
- summarizingLong
- summarizingDouble
- counting
- maxBy
- minBy
- summingDouble
- summingInt
- summingLong
- joining
- reducing
- mapping
- distinct
- limit
- peek
- skip
# 流
java8中新添加的流又称为Streams API
. 它是对集合(Collection)对象功能的增强,它专注于对集合对象进行各种非常便利、高效的聚合操作(aggregate operation),或者大批量数据操作 (bulk data operation).
接下来我们构建一个流:
1 | Stream.of(1, 2, 3) |
我们通过上述代码构建流一个流,这里有俩个概念要说:
- 惰性求值方法:像
filter
方法,它只是在刻画Stream,它并不会被调用.(在Stream方法中凡事返回Stream对象的都是这种方法) - 及早求值方法:像
count
方法,它会从Stream中最终产生值.(在Stream方法中凡事返回空或者另一个值都是这种方法)
常用的流操作
collect()
该方法会产生一个列表,是一个及早求值方法.
1 | Stream.of(1, 2, 3) |
当然我们还可以调用Collectors.toSet()
等其他方法,构建其他集合
map
该操作会将一个流中的值转换为一个新的流
1 | Stream.of(1, 2, 3) |
filter
遍历数据并检查其中的元素是否符合某种条件
这个操作看起来和map
很像, 但是map
是根据操作的结果产生新的流,而filter
是判断流中的数据是否符合条件保留下来
1 | Stream.of(1, 2, 3) |
flatMap
用于Stream替换值然后将多个流连接到一起
首先我们看一种情况,流里有俩个列表
1 | Stream.of(Arrays.asList(1, 2, 3),Arrays.asList(7, 8, 9)) |
如果我们想将这俩个列表组合到一起呢?
1 | Stream.of(Arrays.asList(1, 2, 3),Arrays.asList(7, 8, 9)) |
看到了吧,我们首先讲列表转换成流,然后由flatMap
操作将流组合到一起
max
查找流中的最大值
1 | Integer max = Stream.of(1, 2, 3) |
我们需要向max
操作中传递一个排序的动作. Comparator.comparing()
这个静态方法是java8新添加的方法,它实现流一个方便的比较器.以前我们需要比较俩个对象的某项属性的值,现在只需要提供一个取值方法就好了.
min
查找流中的最小值
1 | Integer min = Stream.of(1, 2, 3) |
和max
相似
reduce
从一组值生成一个值.
1 | Integer sum = Stream.of(1, 2, 3) |
reduce
中的BinaryOperator
类型的lambda表达式第一个参数是上个元素执行reduce
操作的结果, 第二个参数是流中的每个元素.
另外Stream中还有其他的reduce
操作,可以指定开始结束的的位置
元素顺序
在一个有序集合中创建一个流时,流中元素就按照出现的顺序进行排列:
1 | Arrays.asList(1, 2, 3).stream().forEach(ele -> System.out.println(ele)); |
上面这个输出顺序总是1, 2, 3
.
而如果一个集合本身是无序的话,那么生成的流也是无序的,最后由流生成的集合也是无序的
使用收集器
java.util.stream.Collectors
这是java提供的一种通用的,从流生成复杂值结构的收集器.
转换成其他集合
Collectors提供了转换成其他集合的方式
Collectors.toCollection()
: 接受一个函数作为参数,来创建集合Collectors.toConcurrentMap()
Collectors.toList()
: 不需要指定具体的类型,Stream会自动挑选出合适的类型Collectors.toMap()
Collectors.toSet()
: 不需要指定具体的类型,Stream会自动挑选出合适的类型
groupingBy
数据分组
lambda表达式类型
1 | public interface Function<T, R> { |
示例:
1 | List<Integer> list = Arrays.asList(1, 10, 2, 3, 2, 9, 4, 5, 11, 6, 7, 8); |
当然分组的key,我们还可以取其他的类型,这完全取决于我们的返回值
1 | Map<String, List<Integer>> group = list.stream().collect(Collectors.groupingBy(ele -> { |
groupingByConcurrent
并发版本的group by
实现
lambda表达式类型
1 | public interface Function<T, R> { |
示例:
1 | List<Integer> list = Arrays.asList(1, 10, 2, 3, 2); |
partitioningBy
数据分组,key为True
和False
lambda表达式类型
1 | public interface Predicate<T> { |
示例:
1 | List<Integer> list = Arrays.asList(1, 10, 2, 3, 2, 9, 4, 5, 11, 6, 7, 8); |
averagingDouble
lambda表达式类型
1 | public interface ToDoubleFunction<T> { |
示例:
1 | List<Integer> list = Arrays.asList(1, 10, 2, 3, 2); |
averagingInt
lambda表达式类型
1 | public interface ToIntFunction<T> { |
示例:
1 | List<Integer> list = Arrays.asList(1, 10, 2, 3, 2); |
averagingLong
对流中数据进行进行平均数操作
lambda表达式类型
1 | public interface ToLongFunction<T> { |
示例:
1 | List<Integer> list = Arrays.asList(1, 10, 2, 3, 2, 9, 4, 5, 11, 6, 7, 8); |
summarizingInt
lambda表达式类型
1 | public interface ToIntFunction<T> { |
示例:
1 | List<Integer> list = Arrays.asList(1, 10, 2, 3, 2, 9, 4, 5, 11, 6, 7, 8); |
summarizingLong
统计流中数据分布
lambda表达式类型
1 | public interface ToLongFunction<T> { |
示例:
1 | List<Integer> list = Arrays.asList(1, 10, 2, 3, 2, 9, 4, 5, 11, 6, 7, 8); |
summarizingDouble
统计流中数据分布
lambda表达式类型
1 | public interface ToDoubleFunction<T> { |
示例:
1 | List<Integer> list = Arrays.asList(1, 10, 2, 3, 2, 9, 4, 5, 11, 6, 7, 8); |
counting
统计流中数据数量
示例:
1 | List<Integer> list = Arrays.asList(1, 10, 2, 3, 2, 9, 4, 5, 11, 6, 7, 8); |
maxBy
取出一个列表中的最大值,不过我们要自己定义一个对比规则
lambda表达式类型
1 | public interface Comparator<T> { |
示例:
1 | List<Integer> list = Arrays.asList(1, 10, 2, 3, 2, 9, 4, 5, 11, 6, 7, 8); |
minBy
取出一个列表中的最大值,不过我们要自己定义一个对比规则
lambda表达式类型
1 | public interface Comparator<T> { |
示例:
1 | List<Integer> list = Arrays.asList(1, 10, 2, 3, 2, 9, 4, 5, 11, 6, 7, 8); |
summingDouble
对列表数据取和操作,结果为Double
lambda表达式类型
1 | public interface ToDoubleFunction<T> { |
示例:
1 | List<Integer> list = Arrays.asList(1, 10, 2, 3, 2, 9, 4, 5, 11, 6, 7, 8); |
summingInt
对列表数据取和操作,结果为Int
lambda表达式类型
1 | public interface ToIntFunction<T> { |
示例:
1 | List<Integer> list = Arrays.asList(1, 10, 2, 3, 2, 9, 4, 5, 11, 6, 7, 8); |
summingLong
对列表数据取和操作,结果为Long
lambda表达式类型
1 | public interface ToLongFunction<T> { |
示例:
1 | List<Integer> list = Arrays.asList(1, 10, 2, 3, 2, 9, 4, 5, 11, 6, 7, 8); |
joining
将流中的数据拼接成一个字符串. 需要注意的是如果流中的数据不是String
类型的数据,可以通过map
操作将流中数据转换成String
类型
lambda表达式类型
1 | public interface Function<T, R> { |
示例:
1 | List<String> list = Arrays.asList("1", "10", "2", "3", "2"); |
reducing
lambda表达式类型
1 | R apply(T t, U u); |
示例:
1 |
mapping
lambda表达式类型
1 | public interface Function<T, R> { |
示例:
1 | List<String> list = Arrays.asList("1", "10", "2", "3", "2"); |