Stream流的收集操作
- 收集Stream流的含义:就是把Stream流操作后的结果数据 转回 到 集合 或者 数组 中去。
- Stream流:方便操作 集合 / 数组 的 手段。
- 集合 / 数组:才是开发中的 目的 。
Stream流的收集方法
- R collect(Collector collector)
| |
| - 返回包含此流元素的数组,这是一个终端操作。
- 返回:一个数组,其运行时组件类型为Object,包含此流的元素
|
- <A> A [ ] toArray(IntFunction<A [ ] generator>)
| - 使用提供的生成器函数来分配返回的数组,以及分区执行或调整大小可能需要的任何其他数组,返回包含此流元素的数组
- 这是一个终端操作
- 参数:生成器——一个生成所需类型和提供长度的新数组的函数
- 返回:包含此流中元素的数组
- 抛出:ArrayStoreException——如果流中任何元素的运行时类型不能赋值给生成数组的运行时组件类型
- API注意:生成器函数接受一个整数,即所需数组的大小,并生成所需大小的数组,这可以用一个数组构造函数引用来间接地表达:
|
- default List<T> toList(){ return (List<T>)Collections.unmodifiableList(new ArrayList<>(Arrays.asList(this.toArray())))}
| - 将此流的元素累加到List中,列表中的元素将按照该流的相遇顺序(如果存在的话)排列,返回的 List 是 不可修改 的;调用任何mutator方法总是会导致抛出UnsupportedOperationException,不能保证返回的 List 的实现类型或可序列化性。
- 返回的实例可以基于值,调用者不应该对返回实例的身份做任何假设,对这些实例的身份敏感操作(引用相等性(==)、身份散列码 和 同步)是不可靠的,应该避免。这是一个终端操作。
- 返回:包含流元素的List
- API注意:如果需要对返回对象进行更多的控制,请使用Collectors.toCollection(Supplier)
- 实施要求:这个接口的实现返回一个List,就像下面的操作一样 Collections.unmodifiableList(new ArrayList<>(Arrays.asList(this.toArray())))
- 实现注意:Stream的大多数实例将覆盖此方法,并提供与此接口中的实现相比高度优化的实现
- 自JDK 16 起
|
Collectors工具类提供了具体的收集方式
- public static<T> Collector toList()
| |
- public static<T> Collector toSet()
| |
- public static Collector toMap(Function keyMapper,Function valueMapper)
| |
收集Stream流的作用?
- Stream流是操作 集合 / 数组的手段
- 操作的结果数据最终要恢复到集合或者数组中去
package com.csdn.streamcollect;import java.util.*;
import java.util.function.IntFunction;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import java.util.stream.Stream;public class StreamCollectors {public static void main(String[] args) {List<String> list = new ArrayList<>();Collections.addAll(list, "张三丰", "张翠山", "张无忌", "赵敏", "周芷若");// Stream<String> stringStream = list.stream().filter(new Predicate<String>() {
// @Override
// public boolean test(String s) {
// return s.startsWith("张");
// }
// });Stream<String> stringStream = list.stream().filter(s -> s.startsWith("张"));List<String> collect = stringStream.collect(Collectors.toList());System.out.println(collect);//[张三丰, 张翠山, 张无忌]List<String> list1 = list.stream().toList();System.out.println(list1);//[张三丰, 张翠山, 张无忌, 赵敏, 周芷若]Stream<String> stringStream1 = list.stream().filter(s -> s.startsWith("张"));Set<String> collect1 = stringStream1.collect(Collectors.toSet());System.out.println(collect1);//[张翠山, 张三丰, 张无忌]Stream<String> stringStream2 = list.stream().filter(s -> s.startsWith("张"));
// Object[] array = stringStream2.toArray();
// System.out.println(Arrays.toString(array));//[张三丰, 张翠山, 张无忌]// Stream.of(array).forEach(System.out::println);
// 张三丰
// 张翠山
// 张无忌// String[] array = stringStream2.toArray(new IntFunction<String[]>() {
// @Override
// public String[] apply(int value) {
// return new String[value];
// }
// });String[] array = stringStream2.toArray(String[]::new);Stream.of(array).forEach(System.out::println);
// 张三丰
// 张翠山
// 张无忌}
}