Stream 流的创建、筛选、切片
什么是 Stream 流
其本质是高级迭代器且只能遍历一次,Stream 操作的三个核心步骤:创建 Stream、中间操作、终端操作
java
// 请问这一段代码的输出结果是什么?
public static void main(String[] args) {
Stream.of("abc", "abc.com", "abc.com.cn", "abc.cn")
.mapToInt(String::length)
.filter(l -> l > 4)
.peek(System.out::println)
.limit(1);
}Stream 操作的三个步骤
创建 Stream,中间操作,终止操作(终端操作)
创建 Stream 流
通过 Collection 接口获取流
如 List、Set 等集合类型调用 stream()方法
java
// 集合
List<Integer> list = Arrays.asList(6, 7, 8, 9);
Stream<Integer> stream = list.stream();
// 取偶数
list.stream()
.filter(n -> n % 2 == 0)
.forEach(System.out::println);
// 数组
String[] sArr = {"ABCX", "BCSD", "EDFC", "MFFFSS"};
Stream<String> stream1 = Arrays.stream(sArr);
// set
Set<String> se = new HashSet<>();
Stream<String> str2 = se.stream();
// map
Map<String, String> map = new HashMap<>();
Stream<String> str3 = map.keySet().stream();
Stream<String> str4 = map.values().stream();
Stream<Map.Entry<String, String>> str5 = map.entrySet().stream();通过 Stream.of() 静态方法直接创建流
适用于数组或已知数据
java
Stream<String> stro = Stream.of("eee","Lll","kkk");
String[] strss = {"eee","rrr","ttt"};
Stream<String> str7 = Stream.of(strss);
int[] arrm = {886, 333,999};
Stream<int[]> str8 = Stream.of(arrm);Stream 创建注意事项
- Stream 只能操作一次
- Stream 方法返回的是新的流
- Stream 不调用终结方法,中间的操作不会执行
Stream 流筛选、切片
filter:筛选流中的元素(重点)
主要作用是筛选流中的元素,只保留满足特定条件的元素。基于给定的条件(Predicate 函数式接口)过滤流中的元素,创建一个只包含匹配元素的新流。是函数式编程中数据处理的核心工具。
java
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
// 筛选偶数
numbers.stream()
.filter(n -> n % 2 == 0)
.forEach(System.err::println);
// 结果: [2, 4, 6]limit:限制流中元素的数量
它的主要作用是 限制流中元素的数量,获取流的前 n 个元素。返回一个不超过指定长度的流,如果原流长度小于限制长度,则返回原流。
java
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
// 获取前5个元素
List<Integer> firstFive = numbers.stream()
.limit(5)
.collect(Collectors.toList());
// 结果: [1, 2, 3, 4, 5]
// 限制数量大于实际数量
List<Integer> limited = numbers.stream()
.limit(20) // 实际只有10个元素
.collect(Collectors.toList());
// 结果: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10](全部元素)limit() 是控制流大小的关键操作,特别适用于处理大数据集、无限流、分页查询和性能优化场景。它通过限制处理元素数量来提高效率并防止资源耗尽。
skip(n):跳过流的前 n 个元素
它的主要作用是 跳过流的前 n 个元素,返回一个丢弃前 n 个元素后剩余元素组成的新流,如果流中元素不足 N 个,则返回空流。
java
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
// 跳过前3个元素
List<Integer> skipped = numbers.stream()
.skip(3)
.collect(Collectors.toList());
// 结果: [4, 5, 6, 7, 8, 9, 10]
// 跳过数量大于实际数量
List<Integer> empty = numbers.stream()
.skip(15) // 跳过15个,但只有10个元素
.collect(Collectors.toList());
// 结果: [] (空列表)distinct:去除流中的重复元素
主要作用是 去除流中的重复元素,返回一个由不同元素组成的流。基于元素的 equals() 和 hashCode() 方法去除重复元素,保留唯一元素。
java
// 去除重复数字
List<Integer> numbers = Arrays.asList(1, 2, 2, 3, 3, 3, 4, 5, 5);
List<Integer> uniqueNumbers = numbers.stream()
.distinct()
.collect(Collectors.toList());
// 结果: [1, 2, 3, 4, 5]
// 去除重复字符串
List<String> words = Arrays.asList("apple", "banana", "apple", "orange", "banana");
List<String> uniqueWords = words.stream()
.distinct()
.collect(Collectors.toList());
// 结果: ["apple", "banana", "orange"]
朔风