Skip to content

Java 新特性概览

自 Java 8 开始,Java 的发布周期加快,带来了大量旨在提高生产力、代码可读性和性能的新特性。本章将概览一些从 Java 8 到 Java 21 的重要新特性。

Java 8 (2014)

Java 8 是一次里程碑式的更新,引入了函数式编程的理念。

1. Lambda 表达式

Lambda 表达式提供了一种简洁的方式来表示匿名函数,极大地简化了事件监听器、线程等代码的编写。

java
// 旧方式
new Thread(new Runnable() {
    @Override
    public void run() {
        System.out.println("Hello from old Thread!");
    }
}).start();

// 使用 Lambda
new Thread(() -> System.out.println("Hello from Lambda Thread!")).start();

2. Stream API

Stream API 提供了一种声明式、函数式的方式来处理集合数据。它可以让你写出更简洁、更易读的数据处理流水线,并能轻松实现并行处理。

java
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");

// 找出所有以 'A' 开头的名字,转为大写,并打印
names.stream()
     .filter(name -> name.startsWith("A"))
     .map(String::toUpperCase)
     .forEach(System.out::println);

3. Optional

Optional 是一个容器对象,可以包含也可以不包含非 null 值。它旨在解决 NullPointerException (NPE) 问题,鼓励开发者显式地处理可能为空的情况。

4. 接口的默认方法和静态方法

接口现在可以包含具有实现的 default 方法,使得在不破坏现有实现类的情况下向接口添加新功能成为可能。

Java 10 (2018)

局部变量类型推断 (var)

使用 var 关键字,可以让编译器自动推断局部变量的类型,从而减少样板代码。

java
// 旧方式
Map<String, List<Integer>> myMap = new HashMap<>();

// 使用 var
var myMap = new HashMap<String, List<Integer>>();

Java 11 (2018) -長期支持版本(LTS)

String 类的新方法

String 类增加了如 isBlank(), lines(), strip(), repeat() 等实用的新方法。

标准化的 HTTP Client

引入了全新的、现代的 java.net.http.HttpClient API,以替代旧的 HttpURLConnection,支持 HTTP/2 和异步操作。

Java 14 (2020)

switch 表达式

增强了 switch 语句,使其可以作为表达式返回值,并引入了更简洁的 -> 语法,无需 break

java
Day day = Day.MONDAY;
int numLetters = switch (day) {
    case MONDAY, FRIDAY, SUNDAY -> 6;
    case TUESDAY -> 7;
    case THURSDAY, SATURDAY -> 8;
    case WEDNESDAY -> 9;
};

Records (记录类)

Record 是一种特殊的类,用于创建不可变的数据载体。编译器会自动为 record 生成构造方法、equals(), hashCode(), toString() 以及所有字段的访问器方法。

java
// 只需一行代码
public record Point(int x, int y) {}

// 就等同于一个拥有 x, y 字段、构造器、getter、equals/hashCode/toString 的普通类
Point p = new Point(1, 2);
p.x(); // 访问器方法

Java 17 (2021) - 長期支持版本(LTS)

Sealed Classes (密封类)

密封类和接口可以限制哪些其他类或接口可以继承或实现它们。这为库的设计者提供了更强的控制力,也使得 switch 的模式匹配更加强大。

java
// Shape 类只允许 Circle 和 Rectangle 继承
public abstract sealed class Shape permits Circle, Rectangle {
    // ...
}

public final class Circle extends Shape { /*...*/ }
public final class Rectangle extends Shape { /*...*/ }
// class Triangle extends Shape {} // 编译错误!

增强的模式匹配

  • instanceof 的模式匹配: 如果 instanceof 判断为真,可以直接声明一个绑定变量,无需再次强转。
    java
    Object obj = "hello";
    if (obj instanceof String s) {
        // s 在这里可以直接作为 String 使用
        System.out.println(s.toUpperCase());
    }
  • switch 的模式匹配 (预览功能): switch 可以直接对对象的类型进行匹配。

Java 21 (2023) - 長期支持版本(LTS)

虚拟线程 (Virtual Threads)

虚拟线程是 Project Loom 的核心成果,它是一种轻量级的线程实现,旨在显著简化高吞吐量并发应用程序的编写、维护和观察。成千上万甚至数百万的虚拟线程可以由少量的平台线程来管理,大大降低了并发编程的复杂度和资源消耗。

序列化集合 (Sequenced Collections)

引入了一系列新的接口,为集合提供统一的、定义明确的遍历顺序,并提供了访问第一个和最后一个元素的标准方法。

字符串模板 (预览功能)

提供了一种更安全、更强大的方式来构建包含运行时值的字符串,是传统字符串拼接和格式化的现代替代方案。

本站内容仅供学习和研究使用。