Java中开启函数式数据处理的核心是Stream API,它提供声明式、可链式、惰性执行的操作模型;需从集合、数组等创建流,经filter/map等中间操作组装逻辑,再由collect/reduce等终端操作触发计算,且流不可复用。

Java 中开启函数式数据处理,核心就是用好 Stream API —— 它不是替代集合,而是提供一套声明式、可链式、惰性执行的操作模型。关键不在于“怎么写第一行 stream()”,而在于理解它的运行逻辑和使用节奏。
从数据源创建流是第一步
Stream 本身不存数据,必须从已有结构“打开通道”:
- 从 List/Set:直接调用
.stream()或.parallelStream() - 从 数组:用
Arrays.stream(arr)(基本类型数组推荐用IntStream/LongStream避免装箱) - 从 固定值:
Stream.of("a", "b", "c") - 生成无限流(需配合
limit):Stream.iterate(1, n -> n + 1).limit(5)得到 1~5
用中间操作组装处理逻辑
这些操作不立刻执行,只定义“要做什么”,支持无限链式组合:
-
filter(n -> n > 0):筛选正数 -
map(String::toUpperCase):转大写(优先用方法引用,更简洁) -
sorted(Comparator.reverseOrder()):倒序排列 -
distinct():去重(依赖元素的equals和hashCode) -
flatMap(s -> Arrays.stream(s.split(" "))):把字符串列表拆成单词流
终端操作触发实际计算
没有终端操作,前面所有中间操作都是“纸上谈兵”。一旦调用,整条流水线才开始执行,且流被消费后不可复用:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
立即学习“Java免费学习笔记(深入)”;
-
collect(Collectors.toList()):最常用,转回集合 -
reduce(0, Integer::sum):聚合求和 -
findFirst():短路操作,找到第一个就停,适合大数据集提前退出 -
anyMatch(s -> s.startsWith("A")):存在性判断,也短路 -
forEach(System.out::println):注意它产生副作用,不建议用于复杂逻辑
并行处理要谨慎启用
parallelStream() 不等于自动变快。它适合:
- 数据量大(通常 > 10,000 元素)
- 每个元素处理耗时(如解析 JSON、计算哈希)
- 操作无状态、不修改共享变量(避免竞态)
小列表或简单映射,顺序流反而更快——线程调度开销可能超过收益。

















