Switch Statement Trong Java - Hướng Dẫn Java - Huong Dan Java

Views: 1.245

Switch statement trong Java là một câu lệnh dùng để kiểm tra giá trị của một biến, biến này có thể có nhiều giá trị khác nhau, tuỳ theo giá trị của biến này mà chúng ta có thể định nghĩa một tập các câu lệnh khác nhau để thực thi tuỳ theo nhu cầu.

Ví dụ như mình có biến n có thể có giá trị là 1,2,3. Mình muốn là trong trường hợp giá trị của biến n này là 1, mình sẽ in ra dòng chữ là “Khanh”, giá trị là 2 mình sẽ in dòng chữ “Huong Dan Java”, giá trị 3 thì in dòng chữ “Lap Trinh Java”, sử dụng switch statement, mình sẽ viết code như sau:

Java package com.huongdanjava; public class SwitchExample { public static void main(String[] args) { int n = 1; switch (n) { case 1: System.out.println("Khanh"); break; case 2: System.out.println("Huong Dan Java"); break; case 3: System.out.println("Lap Trinh Java"); break; default: break; } } }
12345678910111213141516171819202122 packagecom.huongdanjava; publicclassSwitchExample{ publicstaticvoidmain(String[]args){intn=1;switch(n){case1:System.out.println("Khanh");break;case2:System.out.println("Huong Dan Java");break;case3:System.out.println("Lap Trinh Java");break;default:break;}} }

Ở đây, chúng ta sử dụng case keyword để handle cho từng giá trị khác nhau của biến n. Giá trị được khai báo cho mỗi case phải là COMPILE TIME CONSTANTS nha các bạn! Điều này có nghĩa là khi compile source code, giá trị của mỗi case phải được xác định, không chờ phải đến khi chương trình chạy, execute tới đoạn code switch này thì giá trị của mỗi case mới được xác định.

Để chỉ execute đúng cho từng giá trị của biến n, chúng ta phải sử dụng thêm từ khoá break để sau khi execute tập lệnh đó, chương trình của chúng ta sẽ thoát khỏi switch statement.

Các bạn còn có thể thấy, chúng ta có thêm default label, label này dùng để xử lý cho những trường hợp mà giá trị của biến n này không nằm trong những trường hợp mà switch statement đã handle. Trong một switch statement, chúng ta có thể không cần phải declare default label cũng được, nếu được declare thì cũng không nhất thiết phải declare theo một order nào đó nha các bạn!

Kết quả khi chúng ta chạy đoạn code trên sẽ như sau:

Switch statement trong Java

Như các bạn thấy, vì giá trị của biến n trong trường hợp này là 1 nên case cho giá trị 1 sẽ được thực thi và in ra dòng chữ “Khanh”. Sau khi in dòng chữ xong, tới câu lệnh break, chương trình của chúng ta sẽ thoát khỏi switch statement.

Trước Java 7, các bạn có thể truyền biến có kiểu char, byte, short, int hay wrapper của chúng Character, Byte, Short, Integer và Enum vào switch statement. Từ Java 7 trở đi, switch statement còn hỗ trợ thêm kiểu dữ liệu là String nữa nha các bạn.

Ví dụ như sau:

Java package com.huongdanjava; public class SwitchExample { public static void main(String[] args) { String name = "B"; switch (name) { case "A": System.out.println("Khanh"); break; case "B": System.out.println("Huong Dan Java"); break; case "C": System.out.println("Lap Trinh Java"); break; default: break; } } }
12345678910111213141516171819202122 packagecom.huongdanjava; publicclassSwitchExample{ publicstaticvoidmain(String[]args){Stringname="B";switch(name){case"A":System.out.println("Khanh");break;case"B":System.out.println("Huong Dan Java");break;case"C":System.out.println("Lap Trinh Java");break;default:break;}} }

Kết quả:

Switch statement trong Java

Các bạn có thể truyền vào switch statement một expression miễn sao giá trị trả về của expression này là kiểu dữ liệu cho phép của switch statement.

Ví dụ:

Java package com.huongdanjava; public class SwitchExample { public static void main(String[] args) { int a = 1; int b = 3; switch (a + b) { case 2: System.out.println("Khanh"); break; case 3: System.out.println("Huong Dan Java"); break; case 4: System.out.println("Lap Trinh Java"); break; default: break; } } }
1234567891011121314151617181920212223 packagecom.huongdanjava; publicclassSwitchExample{ publicstaticvoidmain(String[]args){inta=1;intb=3;switch(a+b){case2:System.out.println("Khanh");break;case3:System.out.println("Huong Dan Java");break;case4:System.out.println("Lap Trinh Java");break;default:break;}} }

Kết quả:

Switch statement trong Java

Switch từ Java 12

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ư:
Java 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; } } }
12345678910111213141516171819202122 packagecom.huongdanjava; publicclassSwitchExample{ publicstaticvoidmain(String[]args){inta=1;intb=2;switch(a+b){case2:System.out.println("Khanh");break;case3:System.out.println("Huong Dan Java");case4:System.out.println("Lap Trinh Java");default:System.out.println("Hello");break;}} }

Kết quả:

Các cải tiến của Java cho Switch statement từ Java 12

  • 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:
Java 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; } } }
123456789101112131415161718192021222324 packagecom.huongdanjava; publicclassSwitchExample{ publicstaticvoidmain(String[]args){inta=1;intb=2;switch(a+b){case2:System.out.println("Khanh");break;case3:System.out.println("Huong Dan Java");break;case4:System.out.println("Huong Dan Java");break;default:System.out.println("Hello");break;}} }

Hoặc:

Java 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; } } }
12345678910111213141516171819202122 packagecom.huongdanjava; publicclassSwitchExample{ publicstaticvoidmain(String[]args){inta=1;intb=2;switch(a+b){case2:System.out.println("Khanh");break;case3:case4: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:
Java 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); } }
123456789101112131415161718192021222324 packagecom.huongdanjava; publicclassSwitchExample{ publicstaticvoidmain(String[]args){Stringmessage="";intn=1;switch(n){case1:message="Khanh";break;case2:message="Huong Dan Java";break;case3:message="Lap Trinh Java";break;default:break;}System.err.println(message);} }

Để giải quyết những vấn đề trên, từ Java 12, 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 12 hỗ trợ chúng ta cách viết switch statement giống như lambda expression, ví dụ như:
Java 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"); } } }
12345678910111213141516 packagecom.huongdanjava; publicclassSwitchExample{ publicstaticvoidmain(String[]args){inta=1;intb=2;switch(a+b){case2->System.out.println("Khanh");case3->System.out.println("Huong Dan Java");case4->System.out.println("Lap Trinh Java");default->System.out.println("Hello");}} }

Kết quả:

Các cải tiến của Java cho Switch statement từ Java 12

Đối với vấn đề thứ 2 thì các bạn có thể viết lại switch statement như sau:

Java 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"); } } }
123456789101112131415 packagecom.huongdanjava; publicclassSwitchExample{ publicstaticvoidmain(String[]args){inta=1;intb=2;switch(a+b){case2->System.out.println("Khanh");case3,4->System.out.println("Huong Dan Java");default->System.out.println("Hello");}} }

Kết quả:

Các cải tiến của Java cho Switch statement từ Java 12

Còn đối vấn đề thứ ba thì bây giờ Java 12 đã hỗ trợ chúng ta return lại value với switch expression như sau:

Java 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); } }
12345678910111213141516 packagecom.huongdanjava; publicclassSwitchExample{ publicstaticvoidmain(String[]args){intn=1;varmessage=switch(n){case1->"Khanh";case2->"Huong Dan Java";case3->"Lap Trinh Java";default->"Hello";};System.out.println(message);} }

Kết quả:

Các cải tiến của Java cho Switch statement từ Java 12

Switch từ Java 13

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ể upgrade lên Java 13, sau đó 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:

Java 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); } }
1234567891011121314151617181920212223 packagecom.huongdanjava; publicclassSwitchExample{ publicstaticvoidmain(String[]args){intn=1;varmessage=switch(n){case1->{StringfirstName="Khanh";StringlastName="Nguyen"; StringfullName=firstName+" "+lastName; yield fullName;}case2->"Huong Dan Java";case3->"Lap Trinh Java";default->"Hello";};System.out.println(message);} }

Kết quả:

Các cải tiến của Java cho Switch statement từ Java 12

Switch từ Java 17

Từ Java 17, 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:

Java package com.huongdanjava.javaexample; public interface Shape { }
12345 packagecom.huongdanjava.javaexample; publicinterfaceShape{ }
Java package com.huongdanjava.javaexample; public class Triangle implements Shape { }
12345 packagecom.huongdanjava.javaexample; publicclassTriangleimplementsShape{ }
Java package com.huongdanjava.javaexample; public class Rectangle { }
12345 packagecom.huongdanjava.javaexample; publicclassRectangle{ }

Để 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:

Java 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!"); } } }
1234567891011121314 packagecom.huongdanjava.javaexample; publicclassSwitchExample{publicstaticvoidmain(String[]args){Shape shape=newTriangle();if(shape instanceofTriangle triangle){System.out.println("This is triangle!");}elseif(shape instanceofRectangle rectangle){System.out.println("This is rectangle!");}else{thrownewIllegalArgumentException("Unrecognized shape!");}}}

Từ Java 17, các bạn có thể viết ngắn gọn với switch như sau:

Java 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!"); } } }
123456789101112 packagecom.huongdanjava.javaexample; publicclassSwitchExample{publicstaticvoidmain(String[]args){Shape shape=newTriangle();switch(shape){caseTriangle triangle->System.out.println("This is triangle!");caseRectangle rectangle->System.out.println("This is rectangle!");default->thrownewIllegalArgumentException("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.

Từ khóa » Hàm Switch Trong Java