Java8+新特性
Java 8 是 Java 语言的一个里程碑版本,引入了众多革命性特性,之后的 Java 9+ 在此基础上持续优化和扩展。以下是 Java 8+ 最重要的新特性详解:
一、Java 8 核心特性
1. Lambda 表达式
- 定义:简洁的匿名函数,允许将代码块作为参数传递。
- 语法:
(参数) -> 表达式
或(参数) -> { 代码块 }
- 示例:
// 传统匿名内部类 new Thread(new Runnable() {public void run() {System.out.println("Hello");} }).start();// Lambda表达式 new Thread(() -> System.out.println("Hello")).start();
- 优势:简化代码,增强可读性,特别适合函数式编程。
2. 函数式接口(Functional Interface)
- 定义:仅含一个抽象方法的接口(可含默认方法和静态方法)。
- 注解:
@FunctionalInterface
(编译时校验)。 - 常用内置接口:
Consumer<T>
:接收参数无返回(void accept(T t)
)Supplier<T>
:无参数返回值(T get()
)Function<T, R>
:接收 T 返回 R(R apply(T t)
)Predicate<T>
:接收 T 返回布尔值(boolean test(T t)
)
- 示例:
@FunctionalInterface interface MathOperation {int operate(int a, int b); }MathOperation addition = (a, b) -> a + b; System.out.println(addition.operate(2, 3)); // 输出5
3. Stream API
- 定义:处理集合的高级抽象,支持链式操作和并行处理。
- 核心操作:
- 中间操作(返回 Stream):
filter()
、map()
、sorted()
、distinct()
- 终端操作(返回结果):
collect()
、forEach()
、count()
、reduce()
- 中间操作(返回 Stream):
- 示例:
List<String> list = Arrays.asList("apple", "banana", "cherry", "date");// 筛选长度>5的元素,转大写,收集到列表 List<String> result = list.stream().filter(s -> s.length() > 5).map(String::toUpperCase).collect(Collectors.toList()); // 结果:[BANANA, CHERRY]
- 优势:简化集合处理代码,支持并行流(
parallelStream()
)提升大数据量处理效率。
4. 接口默认方法与静态方法
- 默认方法:接口中用
default
修饰的方法,允许接口扩展而不破坏实现类。interface Vehicle {default void honk() {System.out.println("鸣笛");} } class Car implements Vehicle {} new Car().honk(); // 直接调用默认方法
- 静态方法:接口中用
static
修饰的方法,可直接通过接口调用。interface Vehicle {static void info() {System.out.println("这是交通工具");} } Vehicle.info(); // 调用静态方法
5. Optional 类
- 作用:解决
NullPointerException
,封装可能为 null 的值。 - 常用方法:
ofNullable()
、isPresent()
、orElse()
、ifPresent()
- 示例:
String str = null; // 传统方式(可能NPE) System.out.println(str.length());// Optional方式 Optional<String> optional = Optional.ofNullable(str); optional.ifPresent(s -> System.out.println(s.length())); // 无输出(安全) String result = optional.orElse("默认值"); // 结果:"默认值"
6. 日期时间 API(java.time 包)
- 优势:替代线程不安全的
SimpleDateFormat
和Calendar
,提供不可变对象。 - 核心类:
LocalDate
:日期(年 / 月 / 日)LocalTime
:时间(时 / 分 / 秒)LocalDateTime
:日期 + 时间DateTimeFormatter
:线程安全的格式化工具
- 示例:
// 获取当前日期时间 LocalDateTime now = LocalDateTime.now();// 格式化 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); String formatted = now.format(formatter); // 如:2023-10-05 14:30:00// 日期计算 LocalDate tomorrow = LocalDate.now().plusDays(1);
7. 其他重要特性
- 方法引用:用
::
简化 Lambda,如String::toUpperCase
等价于s -> s.toUpperCase()
。 - 重复注解:允许同一注解在同一位置多次使用(需
@Repeatable
标记)。 - 类型推断增强:泛型实例化可省略类型参数,如
List<String> list = new ArrayList<>()
。
二、Java 9+ 重要特性
1. 模块系统(Java 9)
- 定义:将代码封装为模块(
module-info.java
),显式声明依赖和导出的包,解决 “类路径地狱”。 - 示例:
// module-info.java module com.example.myapp {requires java.base; // 依赖基础模块requires com.example.lib; // 依赖自定义模块exports com.example.myapp.api; // 导出供外部使用的包 }
2. 集合工厂方法(Java 9)
- 作用:简化不可变集合创建。
// 不可变列表 List<String> list = List.of("a", "b", "c"); // 不可变集合 Set<Integer> set = Set.of(1, 2, 3); // 不可变映射 Map<String, Integer> map = Map.of("one", 1, "two", 2);
3. 接口私有方法(Java 9)
- 作用:接口中允许定义私有方法,供默认方法和静态方法复用。
interface MyInterface {default void publicMethod() {privateMethod(); // 调用私有方法}private void privateMethod() {System.out.println("接口私有方法");} }
4. 局部变量类型推断(var,Java 10)
- 作用:用
var
声明局部变量,编译器自动推断类型(增强可读性,减少冗余)var list = new ArrayList<String>(); // 等价于 ArrayList<String> list var map = Map.of("a", 1); // 等价于 Map<String, Integer> map
5. 文本块(Text Blocks,Java 15)
- 作用:简化多行字符串编写(如 JSON、SQL),保留换行和缩进。
String json = """{"name": "Java","version": 17}""";
6. 密封类(Sealed Classes,Java 17)
- 作用:限制类的继承关系,仅允许指定类继承。
public sealed class Shape permits Circle, Rectangle {// 密封类 } final class Circle extends Shape {} // 允许继承 final class Rectangle extends Shape {}
7. Record 类(Java 16)
- 作用:简化 “数据载体类”(如 DTO),自动生成构造方法、
equals()
、hashCode()
、toString()
。record User(String name, int age) {} // 自动包含所有字段的访问器和方法User user = new User("Alice", 25); System.out.println(user.name()); // 输出"Alice"
三、总结
- Java 8 奠定了函数式编程基础(Lambda、Stream、Optional),并优化了日期 API,是企业级开发的主流版本。
- Java 9+ 持续提升开发效率(集合工厂、var、Record)、增强安全性(密封类)和模块化能力,建议新项目直接使用 Java 17(LTS 长期支持版)。
掌握这些特性能显著提升代码简洁性和性能,是现代 Java 开发的必备技能。