Trong bài viết trước, mình đã giới thiệu với các bạn các kiến thức cơ bản về switch statement trong Java. Trong bài viết này, mình sẽ nói thêm về những feature mới mà Java hỗ trợ kể từ phiên bản 14 trở đi các bạn nhé!
Switch từ Java 14
Khi làm việc với switch statement, các bạn sẽ hay gặp những vấn đề sau:
- Vấn đề thứ nhất là chúng ta quên khai báo break statement: điều này có nghĩa code chúng ta sẽ không thoát khỏi switch statement sau khi match case đầu tiên mà sẽ thực thi tiếp những case tiếp theo, ví dụ như:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
package com.huongdanjava; public class SwitchExample { public static void main(String[] args) { int a = 1; int b = 2; switch (a + b) { case 2: System.out.println("Khanh"); break; case 3: System.out.println("Huong Dan Java"); case 4: System.out.println("Lap Trinh Java"); default: System.out.println("Hello"); break; } } } |
Kết quả:
- Vấn đề thứ hai là nếu các bạn muốn trong trường hợp giá trị của biến với các giá trị khác nhau a và b thì xử lý cùng một đoạn code. Chúng ta sẽ viết code như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
package com.huongdanjava; public class SwitchExample { public static void main(String[] args) { int a = 1; int b = 2; switch (a + b) { case 2: System.out.println("Khanh"); break; case 3: System.out.println("Huong Dan Java"); break; case 4: System.out.println("Huong Dan Java"); break; default: System.out.println("Hello"); break; } } } |
Hoặc:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
package com.huongdanjava; public class SwitchExample { public static void main(String[] args) { int a = 1; int b = 2; switch (a + b) { case 2: System.out.println("Khanh"); break; case 3: case 4: System.out.println("Huong Dan Java"); break; default: System.out.println("Hello"); break; } } } |
Những cách viết này bất tiện vì duplicate code hoặc chúng ta đôi khi không control được nên đặt break statement ở chỗ nào.
- Vấn đề thứ ba là nếu các bạn muốn sử dụng switch statement để determine giá trị của một biến nào đó, các bạn phải viết như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
package com.huongdanjava; public class SwitchExample { public static void main(String[] args) { String message = ""; int n = 1; switch (n) { case 1: message = "Khanh"; break; case 2: message = "Huong Dan Java"; break; case 3: message = "Lap Trinh Java"; break; default: break; } System.err.println(message); } } |
Để giải quyết những vấn đề trên, từ Java 14, các bạn có thể viết switch statement với những cải tiến như sau:
- Đối với vấn đề thứ nhất, Java 14 hỗ trợ chúng ta cách viết switch statement giống như lambda expression, ví dụ như:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
package com.huongdanjava; public class SwitchExample { public static void main(String[] args) { int a = 1; int b = 2; switch (a + b) { case 2 -> System.out.println("Khanh"); case 3 -> System.out.println("Huong Dan Java"); case 4 -> System.out.println("Lap Trinh Java"); default -> System.out.println("Hello"); } } } |
Kết quả:
Đối với vấn đề thứ 2 thì các bạn có thể viết lại switch statement như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
package com.huongdanjava; public class SwitchExample { public static void main(String[] args) { int a = 1; int b = 2; switch (a + b) { case 2 -> System.out.println("Khanh"); case 3, 4 -> System.out.println("Huong Dan Java"); default -> System.out.println("Hello"); } } } |
Kết quả:
Còn đối vấn đề thứ ba thì bây giờ Java 14 đã hỗ trợ chúng ta return lại value với switch expression như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
package com.huongdanjava; public class SwitchExample { public static void main(String[] args) { int n = 1; var message = switch (n) { case 1 -> "Khanh"; case 2 -> "Huong Dan Java"; case 3 -> "Lap Trinh Java"; default -> "Hello"; }; System.out.println(message); } } |
Kết quả:
Nếu các bạn muốn thêm code để xử lý business logic trong mỗi case của switch expression thì các bạn có thể thêm code và sử dụng từ khóa yield để return lại giá trị mà mình mong muốn. Ví dụ như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
package com.huongdanjava; public class SwitchExample { public static void main(String[] args) { int n = 1; var message = switch (n) { case 1 -> { String firstName = "Khanh"; String lastName = "Nguyen"; String fullName = firstName + " " + lastName; yield fullName; } case 2 -> "Huong Dan Java"; case 3 -> "Lap Trinh Java"; default -> "Hello"; }; System.out.println(message); } } |
Kết quả:
Switch từ Java 16
Từ Java 16, switch hỗ trợ pattern matching tương tự như toán tử instanceof từ Java 14.
Ví dụ mình có một interface với hai implementation như sau:
1 2 3 4 5 |
package com.huongdanjava.javaexample; public interface Shape { } |
1 2 3 4 5 |
package com.huongdanjava.javaexample; public class Triangle implements Shape { } |
1 2 3 4 5 |
package com.huongdanjava.javaexample; public class Rectangle { } |
Để kiểm tra và in ra implementation của một đối tượng Shape, thông thường chúng ta sẽ viết code như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
package com.huongdanjava.javaexample; public class SwitchExample { public static void main(String[] args) { Shape shape = new Triangle(); if (shape instanceof Triangle triangle) { System.out.println("This is triangle!"); } else if (shape instanceof Rectangle rectangle) { System.out.println("This is rectangle!"); } else { throw new IllegalArgumentException("Unrecognized shape!"); } } } |
Từ Java 16, các bạn có thể viết ngắn gọn với switch như sau:
1 2 3 4 5 6 7 8 9 10 11 12 |
package com.huongdanjava.javaexample; public class SwitchExample { public static void main(String[] args) { Shape shape = new Triangle(); switch (shape) { case Triangle triangle -> System.out.println("This is triangle!"); case Rectangle rectangle -> System.out.println("This is rectangle!"); default -> throw new IllegalArgumentException("Unrecognized shape!"); } } } |
Trong trường hợp, các bạn phải khai báo default case các bạn nhé! Bởi vì đối tượng shape có thể không nằm trong các implementation mà chúng ta đã khai báo trong các cases.
Switch từ Java 23 Preview
Từ Java 23 Preview, switch statement hỗ trợ pattern matching với primitive type đó các bạn! Nghĩa là, bây giờ các bạn có thể viết:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
package com.huongdanjava.java; public class SwitchExample { public static void main() { test(1); } static void test(Object obj) { if (obj instanceof int i) { System.out.println("It's an int: " + i); } } } |
Kết quả: