返回

Java18的新特性 助力开发者高效开发

后端

Java 18 是 Java 编程语言的最新版本,于 2023 年 3 月 21 日发布。它包含了许多新特性和增强功能,旨在提高开发者的生产力和代码质量。

1. Lambda 表达式

Lambda 表达式是一种匿名函数,可以作为参数传递给其他函数或存储在变量中。它们使代码更加简洁和易读,并可以提高性能。

// 传统写法
Comparator<Integer> comparator = new Comparator<Integer>() {
    @Override
    public int compare(Integer o1, Integer o2) {
        return o1 - o2;
    }
};

// Lambda 表达式写法
Comparator<Integer> comparator = (o1, o2) -> o1 - o2;

2. 记录类

记录类是一种轻量级的类,主要用于表示不可变的数据。它们与普通类非常相似,但具有更简单的语法和更少的限制。

public record Person(String name, int age) {

    // 构造函数
    public Person {
        if (name == null || name.isBlank()) {
            throw new IllegalArgumentException("Name cannot be null or blank");
        }
        if (age < 0) {
            throw new IllegalArgumentException("Age cannot be negative");
        }
        this.name = name;
        this.age = age;
    }

    // 获取姓名
    public String getName() {
        return name;
    }

    // 获取年龄
    public int getAge() {
        return age;
    }

    // 重写 equals 方法
    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null || getClass() != obj.getClass()) {
            return false;
        }
        Person person = (Person) obj;
        return name.equals(person.name) && age == person.age;
    }

    // 重写 hashCode 方法
    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }

    // 重写 toString 方法
    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

3. 模式匹配

模式匹配是一种新的语法结构,允许开发者在代码中使用模式来匹配数据。这使得代码更加简洁和易读,并可以提高性能。

switch (fruit) {
    case "apple":
        System.out.println("This is an apple");
        break;
    case "banana":
        System.out.println("This is a banana");
        break;
    case "orange":
        System.out.println("This is an orange");
        break;
    default:
        System.out.println("This is not a fruit");
}

4. 开关表达式

开关表达式是一种新的语法结构,允许开发者使用表达式来控制开关语句。这使得代码更加简洁和易读,并可以提高性能。

int number = 5;

String result = switch (number) {
    case 1:
        return "One";
    case 2:
        return "Two";
    case 3:
        return "Three";
    default:
        return "Other";
};

5. 文本块

文本块是一种新的语法结构,允许开发者在代码中使用多行字符串。这使得代码更加简洁和易读,并可以提高性能。

String text = """
        This is a multiline string.
        It can span multiple lines.
        And it can contain special characters, like " and \.
        """;

6. 增强型 switch 语句

增强型 switch 语句是一种新的语法结构,允许开发者在 switch 语句中使用 yield 来返回结果。这使得代码更加简洁和易读,并可以提高性能。

int number = 5;

String result = switch (number) {
    case 1:
        yield "One";
    case 2:
        yield "Two";
    case 3:
        yield "Three";
    default:
        yield "Other";
};

7. 实例化数组

Java 18 中允许使用 var 关键字来声明和初始化数组。这使得代码更加简洁和易读,并可以提高性能。

int[] numbers = {1, 2, 3, 4, 5};

// Java 17 及更早版本
int[] numbers = new int[] {1, 2, 3, 4, 5};

// Java 18
var numbers = {1, 2, 3, 4, 5};

8. 本地变量类型推断

Java 18 中允许使用 var 关键字来声明本地变量,编译器会自动推断变量的类型。这使得代码更加简洁和易读,并可以提高性能。

// Java 17 及更早版本
int number = 5;

// Java 18
var number = 5;

9. sealed 类

sealed 类是一种新的类修饰符,它允许开发者限制哪些类可以继承它。这使得代码更加安全和易于维护。

sealed class Shape {

    // 子类
    static final class Circle extends Shape { ... }
    static final class Square extends Shape { ... }
    static final class Triangle extends Shape { ... }
}

10. 接口增强

Java 18 中对接口进行了许多增强,包括默认接口方法、静态接口方法和私有接口方法。这些增强使得接口更加灵活和强大。

// 默认接口方法
interface Shape {

    default void draw() {
        System.out.println("Drawing a shape");
    }
}

// 静态接口方法
interface Shape {

    static Shape createCircle() {
        return new Circle();
    }
}

// 私有接口方法
interface Shape {

    private void calculateArea() {
        // 计算面积
    }
}

11. switch 表达式 preview

12. 文本块三引号字符串 preview

13. 模式匹配 for-each 循环 preview

14. 记录类值初始化预览