您的位置:首页 >Java Stream API语法与使用详解
发布于2026-01-11 阅读(0)
扫一扫,手机访问
Java Stream 是一次性管道,执行终端操作后即关闭,重复调用会抛 IllegalStateException;filter 保留元素、map 一对一转换、flatMap 展平嵌套流;需过滤 null 避免 NPE;并行流非万能,受限于数据量、操作状态及 IO 类型。

collect() 或 forEach()Java 的 Stream 不是数据容器,而是一次性管道。一旦执行了终端操作(如 collect()、forEach()、count()),流就关闭了。再调用会抛出 java.lang.IllegalStateException: stream has already been operated upon or closed。
List<String> list = Arrays.asList("a", "b");
Stream<String> s = list.stream();
s.collect(Collectors.toList());
s.forEach(System.out::println); // ❌ 报错list.stream().map(...).collect(...),或把中间操作链写完整再执行终端操作forEach() 打断流;要用 peek(): stream.peek(System.out::println).filter(...)filter()、map()、flatMap() 的关键区别这三个是最常混用的中间操作,核心差异在「返回值类型」和「是否扁平化」:
filter(Predicate<T>):输入 T,输出仍是 T,但只保留满足条件的元素(数量 ≤ 原始)map(Function<T, R>):输入 T,输出 R,一对一转换(数量不变)flatMap(Function<T, Stream<R>>):输入 T,输出 Stream<R>,然后自动“展平”一层(适合处理嵌套集合、Optional、字符串转字符流等)例如把 List<List<Integer>> 拉平成 List<Integer>,必须用 flatMap:
listOfLists.stream()
.flatMap(innerList -> innerList.stream())
.collect(Collectors.toList());
Optional 的配合要点Stream 本身不拒绝 null 元素,但多数终端操作(如 collect())在遇到 null 时可能抛 NullPointerException,尤其在使用 Collectors.toMap() 时键或值为 null 会直接失败。
stream.filter(Objects::nonNull)toMap() 因 key 为 null 失败:stream.filter(Objects::nonNull)
.collect(Collectors.toMap(
item -> item.getId(),
item -> item.getName(),
(a, b) -> a // 冲突解决,防止 key 重复
));Optional 包裹再进流:Optional.ofNullable(obj).map(...).stream(),比在流里判空更清晰parallelStream())不是性能银弹parallelStream() 底层用的是 ForkJoinPool.commonPool(),看似开箱即用,但实际受多个因素制约:
ArrayList 收集)会导致结果不可预测,必须改用线程安全容器或 collect() 的三参数重载CompletableFuture 等异步模型commonPool(),显式构造 ForkJoinPool 并用 submit() 提交任务更可控真正需要并行时,优先验证单线程瓶颈、确认操作无状态、再压测对比。
上一篇:Poki游戏进度保存方法详解
下一篇:Home和End键作用详解
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
9