JDK 8:Lambdas 改变 Java:函数式与流式的同时到来
JDK 8 是 Java 历史上影响最大的一次语言升级:Lambda 让行为可以像数据一样传递,Stream 把集合处理变成可组合的流水线,java.time 修正了旧日期 API 的设计缺陷。同时,default 方法让标准库可以在不破坏实现类的前提下演进。
这一课,你必须能自己回答GOALS
合上资料后,逐条自述
- Lambda 解决了什么表达问题?为什么它必须绑定函数式接口,而不能独立存在?
- Lambda 在字节码层为什么不是匿名内部类?invokedynamic 与 LambdaMetafactory 各自负责什么?
- Stream 的中间操作与终止操作如何分工?惰性求值和短路分别在什么条件下发生?
- parallel stream 什么时候值得用?commonPool、有序性和共享可变状态的边界在哪里?
- Optional 想表达什么?为什么它不适合字段、方法参数和集合元素?
- java.time 为什么能取代 Date/Calendar?LocalDateTime、Instant、ZonedDateTime 各自表示什么?
- default 方法解决了什么兼容性问题?菱形冲突时编译器按什么规则选择?
- PermGen 移除后 Metaspace 如何分配?为什么
-XX:MaxPermSize在 8 上只是警告?
三种模式,各解决一个问题MODES
学习路径TRACKS
面试突击 · 2 小时
先结论后机制先刷 15 道高频题暴露盲区,再回到速查补齐 API 与版本边界。重点看追问和陷阱,不要只背结论。
API 迁移 · 1 天
从旧写法迁移按「Lambda → Stream → Optional → java.time → default 方法」顺序迁移。每步都先确认运行时确实是 JDK 8,避免误用 9+ 的 API。
机制深钻 · 2 天
字节码 + 数据结构从 invokedynamic 看到 LambdaMetafactory,从 Spliterator 看到 Sink 链,再从 hash 扰动看到树化。理解代价,才知道什么时候不该用。
换一个版本,继续同一门课SWITCH
所有完整课程共用「速查 → 深钻 → 面试」结构。切换版本后,再从顶栏版本菜单切一次,就会落在目标版本的同一模块。
全部学习单元9
速查模块 · 6 个主题
Lambda 与函数式接口
Lambda 把「一段行为」变成可以传递的值,类型由函数式接口决定;方法引用是它的简写。理解目标类型、变量捕获和 this,才算真正会用。
Stream 流水线
Stream 把集合处理拆成「来源 → 中间操作 → 终止操作」:中间操作只描述、不执行,终止操作才拉动数据。惰性、短路和并行都建立在这个模型上。
Optional:把缺失写进类型
Optional 用类型表达「可能没有值」,把缺失从隐式 null 变成显式契约。它适合返回值,不适合字段、参数和集合元素;用错会把判空变成拆箱。
java.time:不可变的时间模型
java.time 用不可变对象和清晰的类型分工取代 Date/Calendar:Instant 表示时间线上的点,Local* 表示无时区的人类时间,ZonedDateTime 负责时区与夏令时规则。
接口默认方法与静态方法
JDK 8 允许接口携带方法体:default 方法用于在不破坏实现类的前提下扩展接口,static 方法提供接口级工具。代价是菱形冲突与继承规则变复杂。
迁移到 JDK 8
从 7 升到 8 的难点不在语法,而在工具链与运行时假设:PermGen 参数、class 版本、字节码库、default 方法冲突。先把这些清理干净,再逐步引入 Lambda 与 Stream。
深钻模块 · 3 个主题
Lambda 的字节码真相:invokedynamic 与 LambdaMetafactory
Lambda 不是匿名类的语法糖。编译期,Lambda 体被提取成私有方法,调用点变成 invokedynamic;运行期,LambdaMetafactory 首次链接时生成实现函数式接口的类。
Stream 流水线:惰性、短路与并行边界
Stream 的价值不只是写法短,而是把「遍历策略」从业务代码里抽走:来源决定怎么切分,中间操作决定怎么处理,终止操作决定何时停止。
HashMap 内部结构:扰动、扩容与树化
JDK 8 的 HashMap 用「数组 + 链表 + 红黑树」平衡平均与最坏情况:扰动函数把高位带进低位,2 的幂容量把取模变成位与,树化只在极端碰撞时兜底。
版本上下文JDK 8
JDK 8 于 2014-03-18 发布,是继 5 之后又一次语言级升级。JEP 126 引入 Lambda 与接口默认方法,JEP 107 引入 Stream,JEP 150 引入 java.time,JEP 122 移除永久代。今天绝大多数 Java 项目的写法,仍然建立在这四个变化之上。
var、List.of、Files.readString、String.isBlank、HttpClient、record、sealed、文本块都不属于 JDK 8;边界表会逐项标注。