Stream流
定义:在Java8中,得益于Lambda所带来的函数式编程,引入了一个全新的Stream流概念,它可以用于简化集合和数组操作的API。
核心思想:先得到集合或者数组的Stream流,把元素放上去,然后就用这个Stream流简化的API来方便的操作元素。
集合获取Stream流的方式:可以使用Collection接口中的默认方法stream()
生成流
数组获取Stream流的方式:Arrays.stream(arrs)
或Stream.of(arrs)
常用API(中间操作方法)
名称 | 说明 |
---|---|
Stream<T> filter(Predicate<? super T> predicate) | 用于对流中的数据进行过滤 |
Stream<T> limit(long maxSize) | 获取前几个元素 |
Stream<T> skip(long n) | 跳过前几个元素 |
Stream<T> distinct() | 去除流中重复的元素。依赖(hashCode和equals方法) |
static <T> Stream<T> concat(Stream a, Stream b) | 合并a和b两个流为一个流 |
注意:中间方法也称非终结方法,调用完成后返回新的Stream流可以继续使用,支持链式编程。且在Stream流中无法直接修改集合、数组中的数组。
Stream流的常见终结操作方法
名称 | 说明 |
---|---|
void forEach(Consumer action) | 对此流的每个元素执行遍历操作 |
long count() | 返回此流中的元素数 |
注意:终结操作方法,调用完成后流就无法继续使用了,原因是不会返回Stream了。
Stream流的收集操作
就是把Stream流操作后的结果数据转回到集合或者数组中去。这样做的原因是Stream是方便操作集合/数组的手段,而集合/数组才是开发中的目的。
Stream流的收集方法
名称 | 说明 |
---|---|
R collect(Collector collector) | 开始收集Stream流,指定收集器 |
Collectors工具类提供了具体的收集方式
名称 | 说明 |
---|---|
public static <T> Collector toList() | 把元素收集到List集合中 |
public static <T> Collector toSet() | 把元素收集到Set集合中 |
public static Collector toMap(Function keyMapper , Function valueMapper) | 把元素收集到Map集合中 |
例子:
List<String> names = new ArrayList<>();
Collections.addAll(names, "张三丰", "张无忌", "周芷若", "赵敏", "张超");
Stream<String> s1 = names.stream().filter(s -> s.startsWith("张"));
List<String> result = s1.collect(Collectors.toList());
System.out.println(result);
// 也可以使用以下形式,但生成的是不可变集合
List<String> result = s1.toList();
System.out.println(result);