2026/9/1 4:58:41
网站建设
项目流程
一、获取Stream流(创建流)
| 来源 | 方法 | 说明 |
|---|
| Collection集合 | list.stream() | 获取集合的串行流(最常用) |
| Collection集合 | list.parallelStream() | 获取并行流,多线程处理 |
| 数组 | Arrays.stream(数组)/Stream.of(数组) | 数组转流 |
| 多个零散值 | Stream.of(T... values) | 直接传入多个对象生成流 |
二、中间操作(返回Stream对象,链式调用,延迟执行,不会真正执行)
中间操作做完只是记录操作,必须调用终结方法才会真正跑逻辑。
| 方法 | 函数式接口 | 作用 | 简单示例 |
|---|
filter() | Predicate<T> | 过滤,保留满足条件元素 | .filter(s‑>s.length()>3) |
map() | Function<T,R> | 一对一转换,把元素转为另一种类型 | .map(s‑>s.length()) |
distinct() | ‑ | 去重,依赖equals()、hashCode() | .distinct() |
sorted() | Comparator<T> | 排序;无参使用自然排序,传Comparator自定义规则 | .sorted((a,b)->b‑a) |
limit(long n) | ‑ | 截取流前n个元素 | .limit(3) |
skip(long n) | ‑ | 跳过前n个元素,取后面 | .skip(2) |
flatMap() | Function<T,Stream<R>> | 扁平化,拆分层级集合(一对多) | .flatMap(c‑>c.stream()) |
三、终结操作(触发真正执行,关闭流,流不能再继续使用)
| 方法 | 返回值类型 | 作用 | 示例 |
|---|
forEach() | void | 遍历流中每一个元素,执行消费逻辑 | .forEach(System.out::println) |
count() | long | 统计流中元素数量 | .count() |
collect() | R | 收集,把流转回集合(List/Set/Map) | .collect(Collectors.toList()) |
max(comparator) | Optional<T> | 获取最大值 | .max(Integer::compareTo) |
min(comparator) | Optional<T> | 获取最小值 | .min(Integer::compareTo) |
anyMatch() | boolean | 任意一个匹配返回true(短路) | .anyMatch(s‑>s.contains("a")) |
allMatch() | boolean | 全部元素匹配返回true | .allMatch(s‑>s.length()>1) |
noneMatch() | boolean | 全部都不匹配返回true | .noneMatch(Objects::isNull) |
findFirst() | Optional<T> | 获取流中第一个元素 | .findFirst() |
findAny() | Optional<T> | 获取流中任意一个(并行流性能好) | .findAny() |
reduce() | Optional<T>/T | 归约、聚合计算(求和、求乘积) | .reduce(0,Integer::sum) |
四、课程重点注意事项(面试高频)
- 流只能使用一次:执行完终结操作,流直接关闭,再次调用方法抛出
IllegalStateException。 - 中间操作是延迟执行,写一堆filter/map不会运行代码,必须调用终结方法才执行。
distinct()去重依赖对象的equals()和hashCode(),自定义对象需要重写这两个方法。- 不要在Stream操作中修改原始集合中的元素(会产生并发修改异常)。
collect(Collectors.toList())是开发最常用的收集方法,把流变回List集合。
最简完整示例(课程demo风格)
List<String> list = Arrays.asList("张三","李四","张三丰","王五"); List<String> res = list.stream() .filter(s‑>s.length()>2) //中间:过滤 .map(String::toUpperCase) //中间:转换 .limit(2) //中间:截取 .collect(Collectors.toList()); //终结:收集 System.out.println(res);