Java的Stream流
# Stream流
# Stream流的详解
# 什么是Stream流?
在Java 8中,得益于Lambda所带来的函数式编程, 引入了一个全新的Stream流概念。
目的:用于简化集合和数组操作的API
# Stream流思想
Stream流式思想的核心:
- 先得到集合或者数组的Stream流(就是一根传送带)
- 把元素放上去
- 然后就用这个Stream流简化的API来方便的操作元素。
# Stream流的作用
需求:按照下面的要求完成集合的创建和遍历
- 创建一个集合,存储多个字符串元素
- 把集合中所有以"张"开头的元素存储到一个新的集合
- 把"张"开头的集合中的长度为3的元素存储到一个新的集合
- 遍历上一步得到的集合中的元素输出。
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;
public class StreamDemo {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("张无忌");
list.add("周芷若");
list.add("赵敏");
list.add("张强");
list.add("张三丰");
list.stream().filter(s -> s.startsWith("张")).forEach(System.out::println);
// map加工方法:第一个参数原材料 -> 第二个参数是加工后的结果
// 给集合元素的前面都加上一个: 黑马的
list.stream().map(s -> "黑马的:" + s).forEach(s -> System.out.println(s));
}
}
运行结果:
张无忌
张强
张三丰
黑马的:张无忌
黑马的:周芷若
黑马的:张强
黑马的:张三丰
黑马的:赵强
黑马的:赵敏
Stream流的作用是什么,结合了什么技术?
- 简化集合、数组操作的API。结合了Lambda表达式。
说说Stream流的思想和使用步骤。
- 先得到集合或者数组的Stream流(就是一根传送带)。
- 把元素放上去。
- 然后就用这个Stream流简化的API来方便的操作元素。
# Stream流的获取
Stream操作集合或者数组的第一步是先得到Stream流,然后才能使用流的功能。
集合获取Stream流的方式
可以使用Collection接口中的默认方法stream()生成流
名称 | 说明 |
---|---|
default Stream<E> stream() | 获取当前集合对象的Stream流 |
数组获取Stream流的方式
名称 | 说明 |
---|---|
public static <T> Stream<T> stream(T[] array) | 获取当前数组的Stream流 |
public static<T> Stream<T> of(T... values) | 获取当前数组/可变数据的Stream流 |
示例:
import java.util.*;
import java.util.stream.Stream;
public class StreamDemo2 {
public static void main(String[] args) {
/*---------------------------Collection集合获取流-------------------------------*/
Collection<String> list = new ArrayList<>();
Stream<String> s = list.stream();
/*---------------------------Map集合获取流-------------------------------*/
Map<String,Integer> maps = new HashMap<>();
// 键值
Stream<String> keyStream = maps.keySet().stream();
// 值流
Stream<Integer> valueStream = maps.values().stream();
// 键值对流(拿整体)
Stream<Map.Entry<String,Integer>> keyAndValueStream = maps.entrySet().stream();
/*---------------------------数组获取流-------------------------------*/
String[] name = {"小昭","赵敏","王聪","李明"};
Stream<String> nameStream = Arrays.stream(name);
Stream<String> nameStream2 = Stream.of(name);
}
}
# Stream流的常用方法
Stream流的常用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流的常见终结操作方法
注意:
终结操作方法,调用完成后流就无法继续使用了,原因是不会返回Stream了。
名称 | 说明 |
---|---|
void forEach(Consumer action) | 对此流的每个元素执行遍历操作 |
long count() | 返回此流中的元素数 |
import java.util.ArrayList;
import java.util.Collections;
importjava.util.List;
import java.util.stream.Collectors;
public class StreamDemo4 {
public static void main(String[] args) {
List<String> list1 = new ArrayList<>();
Collections.addAll(list1,"abc","abcd","bac","bbc","abc");
// filter的用法: 用于对流中的数据进行过滤
list1.stream().filter(s -> s.startsWith("a")).forEach(s ->System.out.println(s));
// distinct的用法: 去除重复的元素
List<String> distincted = list1.stream().distinct().collect(Collectors.toList());
System.out.println(distincted);
// limit的用法: 获取前两个元素
List<String> limit = list1.stream().limit(2).collect(Collectors.toList());
System.out.println(limit);
// skip的用法: 跳过前三个元素
List<String> skip = list1.stream().skip(3).collect(Collectors.toList());
System.out.println(skip);
// map的用法: 添加额外的内容
List<String> mapped = list1.stream().map(s -> "内容为:" +s).collect(Collectors.toList());
System.out.println(mapped);
}
}
运行结果:
abc
abcd
abc
[abc, abcd, bac, bbc]
[abc, abcd]
[bbc, abc]
[内容为:abc, 内容为:abcd, 内容为:bac, 内容为:bbc, 内容为:abc]
终结和非终结方法的含义是什么?
- 终结方法后流不可以继续使用,非终结方法会返回新的流,支持链式编程。
# 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集合中 |
示例:
package com.Stream;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class StreamDemo6 {
public static void main(String[] args) {
List<String> names = new ArrayList<>();
Collections.addAll(names,"张三丰","张无忌","周芷若","赵敏","张强");
Stream<String> s = names.stream().filter(s1 -> s1.startsWith("张"));
List<String> zhanglist = s.collect(Collectors.toList());
System.out.println(zhanglist);
// 注意注意: 流只能使用一次
// Set<String> zhangSet = s.collect(Collectors.toSet());
// System.out.println(zhangSet);
Stream<String> s3 = names.stream().filter(s1 -> s1.startsWith("张"));
Object[] arrs = s3.toArray();
System.out.println("Arrays数组的内容:"+ Arrays.toString(arrs));
}
}
运行结果:
[张三丰, 张无忌, 张强]
Arrays数组的内容:[张三丰, 张无忌, 张强]
上次更新: 2023/11/28, 22:03:59