Sự lặp lại là mẹ của việc học. Mặc dù trước đó chúng ta đã nói về từ khóa switch của Java , nhưng hôm nay chúng ta sẽ xem lại những điều cơ bản và tìm hiểu một số thông tin mới.

Java có hai loại cấu trúc chuyển đổi : câu lệnh chuyển đổi và biểu thức chuyển đổi. Biểu thức chuyển đổi đã trở thành chính thức trong Java 14, đã tồn tại ở hai biến thể "xem trước" không chính thức trong phiên bản 12 và 13.

Nhưng hãy bắt đầu lại từ đầu. Hãy nhớ lại một công tắc cũ trông như thế nào trước phiên bản 12:


public String getProductTypeByName(String product) {
    String productType = "";

    switch (product) {
        case "Apple":
            productType = "Fruit";
            break;

        case "Peach":
            productType = "Fruit";
            break;

        case "Raspberry":
            productType = "Berry";
            break;

        case "Cherry":
            productType = "Berry";
            break;

        case "Tomato":
            productType = "Vegetable";
            break;

        default:
            productType = "other";
            break;
    }
        
    return productType;
}

Câu lệnh chuyển đổi là một tập hợp các cấu trúc sẽ được thực thi lần lượt. Nó không cho phép bạn trả về một giá trị. Vấn đề chính khi sử dụng câu lệnh chuyển đổi là bạn có thể thêm vô số biểu thức trường hợp và khả năng này thường bị các lập trình viên lạm dụng.

Java 12 chứng kiến ​​việc bổ sung một tính năng thử nghiệm: một phiên bản mới của switch — không phải câu lệnh switch, mà là biểu thức switch — có thể mang lại một giá trị, sử dụng lập trình chức năng bên trong và hợp nhất các câu lệnh tình huống có giá trị chung, do đó tạo ra xây dựng nhỏ gọn.

Trong Java 12, bạn có thể viết lại phương thức getProductTypeByName() như sau:


public String getProductTypeByName(String product) {
    return switch (product) {
        case "Apple", "Peach" -> "Fruit";
        case "Raspberry", "Cherry" -> "Berry";
        case "Tomato" -> "Vegetable";
        default -> "other";

    };
}

Bây giờ mã trông sạch hơn. Cú pháp mũi tên từ lập trình chức năng cho phép chúng ta trả về các giá trị mà không cần từ khóa ngắt và nói chung, kết quả của việc thực hiện chuyển đổi giờ đây có thể được lưu vào một biến hoặc được trả về thông qua từ khóa trả về .

Nếu chúng ta không chỉ cần trả về một kết quả mà còn cần nhiều dòng mã, thì công tắc của chúng ta sẽ trông như thế này:


public String getProductTypeByName(String product) {
    var result = switch (product) {
        case "Apple", "Peach" -> {
            System.out.println("This is a Fruit");
            break "Fruit";
        }
        case "Raspberry", "Cherry" -> {
            System.out.println("This is a Berry");
            break "Berry";
        }
        case "Tomato" -> {
            System.out.println("This is a Vegetable");
            break "Vegetable";
        }
        default -> {
            break "other";
        }

    };
     return result;
}

Trong Java 13, biểu thức chuyển đổi vẫn là một tính năng thử nghiệm. Để làm cho nó khả dụng, giống như trong Java 12, bạn cần sử dụng lệnh --enable-preview khi biên dịch và chạy. "Đổi mới" chính và về cơ bản duy nhất của công tắc trong Java 13 là từ khóa suất , thay thế cho break .


public String getProductTypeByName(String product) {
    var result = switch (product) {
        case "Apple", "Peach" -> {
            System.out.println("This is a Fruit");
            yield "Fruit";
        }
        case "Raspberry", "Cherry" -> {
            System.out.println("This is a Berry");
            yield "Berry";
        }
        case "Tomato" -> {
            System.out.println("This is a Vegetable");
            yield "Vegetables";
        }
        default -> {
            System.out.println("Other");
            yield "other";
        }

    };
    return result;
}

Sự khác biệt chính giữa yieldbreakbreak trả về điều khiển thực thi từ một câu lệnh case , nhưng yield trả về kết quả của toàn bộ switch , hoạt động giống như một câu lệnh return bên trong .

Trong Java 14, toán tử instanceof đã thay đổi và giờ đây có thể được sử dụng như sau:


if (o instanceof String s) {
s.toLowerCase();
}

Thay vì cách cũ hơi xấu xí, nơi bạn không chỉ phải kiểm tra biến bằng cách sử dụng instanceof mà còn chuyển nó sang một loại cụ thể.


if(s instanceof String) {
((String) s).toLowerCase();
}

Những thay đổi này là một phần của dự án Amber, nhằm mục đích thêm hỗ trợ khớp mẫu cho Java.

Nhờ sự thay đổi trong toán tử instanceof trong phiên bản 14 và một tiện ích mở rộng trong phiên bản 16, tính năng khớp mẫu đã được đưa vào phiên bản 17 sau tất cả. Đúng, hiện tại nó chỉ tồn tại dưới dạng bản xem trước. Bạn có thể dùng thử với --enable-preview :


public String getObjectType(Object object) {
    return switch (object) {
        case Integer i -> "Integer";
        case Long l -> "Long";
        case String s -> "String";
        default -> object.toString();
    };
}

Nói chung, mỗi phiên bản mới mang lại ngày càng nhiều tính năng thú vị hơn cho ngôn ngữ này, điều này làm cho việc phát triển Java trở nên thú vị hơn.