Java 8 速查手册:核心新特性、语法、API 与最佳实践一站式参考
Java 8 概览
Java 8 于 2014 年 3 月 18 日发布,是 Java 发展史上里程碑式的版本。它引入了函数式编程支持、全新 Stream API、日期时间 API、Optional、Nashorn 引擎、默认方法等特性,极大提升了开发效率与代码表达力。
核心新特性
- Lambda 表达式 — 让 Java 拥有函数式编程能力,简化匿名内部类写法。
- 方法引用 — 通过
::引用现有方法或构造器,代码更简洁。 - 默认方法 — 接口可提供默认实现,解决接口演进兼容性问题。
- Stream API — 声明式集合处理,支持链式操作、并行计算。
- 日期时间 API —
java.time包,不可变、线程安全、领域驱动设计。 - Optional — 显式建模“值可能缺失”,消除空指针异常。
- Nashorn — 高性能 JavaScript 引擎,支持 JS 与 Java 双向互调。
- Base64 — 标准库原生支持 Basic/URL/MIME 编解码。
- 新工具 —
jdeps依赖分析、jjsJS 执行器等。
Lambda 表达式
语法
(parameters) -> expression
(parameters) -> { statements; }
特点
- 参数类型可省略(类型推断)
- 单参数可省略圆括号
- 单表达式可省略大括号与
return
示例:四则运算与问候
public class Java8Tester {
interface MathOp { int op(int a, int b); }
interface Greeting { void say(String msg); }
private int operate(int a, int b, MathOp op) { return op.op(a, b); }
public static void main(String[] args) {
Java8Tester t = new Java8Tester();
MathOp add = (a, b) -> a + b;
MathOp sub = (a, b) -> a - b;
MathOp mul = (a, b) -> { return a * b; };
MathOp div = (a, b) -> a / b;
System.out.println("10 + 5 = " + t.operate(10, 5, add));
System.out.println("10 - 5 = " + t.operate(10, 5, sub));
System.out.println("10 * 5 = " + t.operate(10, 5, mul));
System.out.println("10 / 5 = " + t.operate(10, 5, div));
Greeting g1 = msg -> System.out.println("Hello " + msg);
Greeting g2 = (msg) -> System.out.println("Hello " + msg);
g1.say("Mahesh");
g2.say("Suresh");
}
}
输出
10 + 5 = 15 10 - 5 = 5 10 * 5 = 50 10 / 5 = 2 Hello Mahesh Hello Suresh
变量作用域
Lambda 只能引用 final 或“效果上 final”(仅赋值一次)的局部变量。
方法引用
四种形式:
- 静态方法:
ClassName::staticMethod - 实例方法:
instance::method - 任意对象的实例方法:
ClassName::method - 构造器:
ClassName::new
Listnames = Arrays.asList("Mahesh", "Suresh", "Ramesh"); names.forEach(System.out::println); // 静态方法引用
函数式接口
仅包含一个抽象方法的接口,可隐式转换为 Lambda。Java 8 在 java.util.function 包提供 40+ 标准函数式接口,常用包括:
| 接口 | 参数 | 返回 | 用途 |
|---|---|---|---|
| Predicate<T> | T | boolean | 条件判断 |
| Function<T,R> | T | R | 转换映射 |
| Consumer<T> | T | void | 消费操作 |
| Supplier<T> | 无 | T | 供给值 |
| UnaryOperator<T> | T | T | 一元运算 |
| BinaryOperator<T> | (T,T) | T | 二元运算 |
Predicate 示例
Listlist = Arrays.asList(1,2,3,4,5,6,7,8,9); eval(list, n -> true); // 全部 eval(list, n -> n % 2 == 0); // 偶数 eval(list, n -> n > 3); // 大于 3 static void eval(List list, Predicate p) { for (Integer n : list) if (p.test(n)) System.out.print(n + " "); }
默认方法
接口中用 default 关键字定义实现,实现类可继承或覆盖。解决多接口默认方法冲突的两种方式:
- 在实现类中显式重写
- 用
InterfaceName.super.method()显式调用指定接口的默认实现
接口还可定义 static 静态辅助方法。
Stream API
Stream 代表元素序列,支持聚合操作(filter、map、reduce 等),具有:
- 非存储、按需计算
- 流水线操作(中间操作返回 Stream,终端操作触发计算)
- 内部迭代,易于并行化(
parallelStream())
常用操作速查
| 操作 | 类型 | 说明 |
|---|---|---|
| filter | 中间 | 按条件过滤 |
| map | 中间 | 元素转换 |
| flatMap | 中间 | 扁平化映射 |
| distinct | 中间 | 去重 |
| sorted | 中间 | 排序 |
| limit/skip | 中间 | 截取/跳过 |
| forEach | 终端 | 遍历消费 |
| collect | 终端 | 归约收集(toList, joining 等) |
| reduce | 终端 | 聚合计算 |
| count/min/max | 终端 | 统计 |
| anyMatch/allMatch/noneMatch | 终端 | 匹配判断 |
| findFirst/findAny | 终端 | 查找 |
Collectors 工具
// 收集为 List Listfiltered = list.stream().filter(s -> !s.isEmpty()).collect(Collectors.toList()); // 字符串拼接 String joined = list.stream().filter(s -> !s.isEmpty()).collect(Collectors.joining(", ")); // 统计摘要 IntSummaryStatistics stats = numbers.stream().mapToInt(x -> x).summaryStatistics();
并行流
long count = list.parallelStream().filter(s -> s.isEmpty()).count();
Optional 类
核心方法:of、ofNullable、empty、isPresent、ifPresent、get、orElse、orElseGet、orElseThrow、filter、map、flatMap。
最佳实践:避免直接调用 get(),优先用 orElse/orElseGet/ifPresent。
Nashorn JavaScript
jjs命令行工具:执行 .js 文件、交互模式、参数传递(arguments)ScriptEngineManager在 Java 中执行 JS- JS 中通过
Java.type('full.ClassName')调用 Java 类