Java作为企业级开发的主流语言,自Java 8发布以来经历了重大变革。本文将系统梳理从Java 8到最新Java 22的主要新特性,帮助开发者掌握现代Java开发的核心技术。

Java 8 (2014):函数式编程的引入

Java 8是Java发展史上的里程碑版本,引入了函数式编程范式。

Lambda表达式

// 旧方式
Collections.sort(list, new Comparator<String>() {
    public int compare(String a, String b) {
        return b.compareTo(a);
    }
});

// Java 8方式
Collections.sort(list, (a, b) -> b.compareTo(a));

Stream API

List<String> filtered = list.stream()
    .filter(s -> s.startsWith("A"))
    .map(String::toUpperCase)
    .sorted()
    .collect(Collectors.toList());

方法引用

Arrays.asList("a","b","c").forEach(System.out::println);

默认方法

interface Vehicle {
    default void print() {
        System.out.println("我是一辆车!");
    }
}

Optional类

Optional<String> optional = Optional.ofNullable(null);
System.out.println(optional.orElse("default"));

Java 9 (2017):模块化系统

模块系统(Jigsaw)

module com.example.myapp {
    requires java.base;
    requires java.sql;
    exports com.example.myapp.api;
}

集合工厂方法

List<String> list = List.of("a", "b", "c");
Set<String> set = Set.of("a", "b", "c");
Map<String, String> map = Map.of("k1", "v1", "k2", "v2");

接口私有方法

interface MyInterface {
    private void privateMethod() {
        System.out.println("私有接口方法");
    }
}

Java 10 (2018):局部变量类型推断

var关键字

var list = new ArrayList<String>();  // 推断为ArrayList<String>
var stream = list.stream();          // 推断为Stream<String>

Java 11 (2018):首个LTS版本

HTTP客户端(标准化)

HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("https://example.com"))
    .build();
client.sendAsync(request, HttpResponse.BodyHandlers.ofString())
    .thenApply(HttpResponse::body)
    .thenAccept(System.out::println);

字符串API增强

"  hello  ".strip();          // "hello"
"hello".repeat(3);           // "hellohellohello"
"".isBlank();               // true

Java 12-14:预览特性引入

Switch表达式(Java 12预览,14标准化)

String dayType = switch (day) {
    case MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY -> "工作日";
    case SATURDAY, SUNDAY -> "周末";
};

文本块(Java 13预览,15标准化)

String json = """
    {
        "name": "John",
        "age": 30
    }
    """;

instanceof模式匹配(Java 14预览,16标准化)

if (obj instanceof String s) {
    System.out.println(s.length());
}

Java 15-17:新特性巩固

密封类(Java 15预览,17标准化)

public sealed class Shape permits Circle, Square, Rectangle {
    // ...
}

public final class Circle extends Shape {
    private final double radius;
    // ...
}

记录类(Java 16)

public record Point(int x, int y) {}

Point p = new Point(10, 20);
System.out.println(p.x());  // 10

Java 18-20:持续创新

简单Web服务器(Java 18)

jwebserver -p 8000

虚拟线程预览(Java 19)

try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
    IntStream.range(0, 10_000).forEach(i -> {
        executor.submit(() -> {
            Thread.sleep(Duration.ofSeconds(1));
            return i;
        });
    });
}

switch模式匹配(Java 20预览)

static String formatterPatternSwitch(Object obj) {
    return switch (obj) {
        case Integer i -> String.format("int %d", i);
        case Long l    -> String.format("long %d", l);
        case Double d  -> String.format("double %f", d);
        case String s  -> String.format("String %s", s);
        default        -> obj.toString();
    };
}

Java 21 (2023 LTS):虚拟线程正式发布

虚拟线程

Thread.startVirtualThread(() -> {
    System.out.println("Hello from virtual thread!");
});

序列集合

interface SequencedCollection<E> extends Collection<E> {
    // 新增方法
    SequencedCollection<E> reversed();
    void addFirst(E);
    void addLast(E);
    E getFirst();
    E getLast();
    E removeFirst();
    E removeLast();
}

Java 22 (2024):最新特性

未命名变量和模式

try {
    int value = Integer.parseInt(s);
} catch (NumberFormatException _) {
    System.out.println("无效数字");
}

字符串模板(预览)

String name = "Joan";
String info = STR."My name is \{name}";

总结与建议

从Java 8到Java 22,Java语言经历了从面向对象到函数式编程,再到现代并发模型的转变。对于开发者而言:

  1. 生产环境建议使用LTS版本(目前为Java 11、17、21)
  2. 新项目建议从Java 17或21开始
  3. 关注虚拟线程、记录类、模式匹配等现代特性
  4. 逐步将Lambda和Stream API应用到现有代码中

Java的持续创新确保了其在企业级开发中的领先地位,掌握这些新特性将显著提升开发效率和代码质量。