Stream是数据加工流水线,非容器;中间操作返回新流可链式调用,终结操作消耗流且仅一次;常见坑包括双列集合需转keySet/entrySet再stream、Lambda中优先用方法引用。

记Stream,别死背API,关键抓住三条主线:它是什么、怎么用、容易踩什么坑。
Stream本质:不是容器,是加工流水线
它不存数据,也不改原集合,只对数据源做“视图式处理”。就像把原料送进工厂流水线——中间环节(filter/map/sorted)只是下指令,真正干活得等最后一步(collect/forEach/count)触发。记不住所有方法?先盯住这句:中间操作返回新流、可链式调用;终结操作消耗流、只能有一次。
常用操作分两类,按目的记比按名字记更牢
- 筛选类:filter(留符合条件的)、distinct(去重)、limit/skip(掐头去尾)
- 转换类:map(一对一变型,比如字符串转大写)、flatMap(一对多展开,比如把List<List>摊平)
- 终结动作:forEach(边看边处理)、collect(收集成List/Set/Map)、count(数个数)、findFirst/findAny(取一个)
写法套路固定,三步走形成肌肉记忆
每段Stream代码基本都长这样:
- 源头:list.stream() 或 Arrays.stream(arr) 或 Stream.of(a,b,c)
- 加工链:.filter(...).map(...).sorted(...)
- 收尾:.collect(Collectors.toList()) 或 .forEach(System.out::println)
双列集合(如HashMap)不能直接stream(),得先转成keySet()或entrySet()再调用stream()——这个细节常被忽略,但一错就报编译错误。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
立即学习“Java免费学习笔记(深入)”;
方法引用不是炫技,是让代码更干净的工具
当你写 a -> a.toUpperCase(),其实就是在重复String::toUpperCase已有的逻辑。直接写方法引用,既少打字又语义清晰。记住四类写法:
- 静态方法:Integer::parseInt
- 实例方法(对象已知):str::length
- 实例方法(对象未知):String::length
- 构造器:Person::new
遇到Lambda里只调一个方法,就条件反射想:能不能换成::?

















