Bài 3.2. Cấu trúc ra quyết định switch
Nội dung bài học
Mục đích sử dụng
- Sử dụng cấu trúc switch khi một biểu thức nào đó có nhiều hơn 2 trường hợp cần đánh giá. Các biểu thức của cấu trúc này thường là các hằng số, các kiểu nguyên hoặc String.
- Như vậy:
- Nếu một biểu thức chỉ có hoặc đúng hoặc sai ta dùng cấu trúc if
- Nếu một biểu thức cần đối chiếu với nhiều giá trị khác nhau, ta dùng cấu trúc switch
Cú pháp tổng quát
- Sau đây là cú pháp tổng quát của cấu trúc switch:
switch (biểu_thức) {
case giá_trị1:
// làm gì đó nếu trường hợp này xảy ra
break;
case giá_trị2:
// làm gì đó nếu trường hợp này xảy ra
break;
case giá_trị3:
// làm gì đó nếu trường hợp này xảy ra
break;
...
default:
// làm gì đó nếu tất cả các case phía trên không xảy ra
}
- Trong đó:
- Cấu trúc bắt đầu với từ khóa switch.
- Kế tiếp là cặp ngoặc tròn ( ).
- Bên trong ngoặc tròn là biểu thức có tính chất nguyên, ví dụ biến kiểu nguyên(byte, short, char,int) hoặc lớp bao của chúng, hằng số, enum, String…
- không dùng kiểu long hoặc Long
- Phần thân switch ở phía trong cặp ngoặc { }.
- Mỗi case tương đương với 1 vế if.
- Đi sau case là dấu cách, sau đó đến giá trị cần đối sánh và cuối cùng là dấu hai chấm. Giá trị cần đối sánh phải cùng kiểu với kiểu của biểu thức trong switch.
- Nội dung cần thực hiện của mỗi case sẽ viết sau dấu hai chấm :
- Kết thúc mỗi case là từ khóa break. Nhiệm vụ của break là thoát khỏi cấu trúc switch khi thực hiện xong nhiệm vụ. Nếu bạn quên break, các case liền dưới của case hiện tại sẽ được thực hiện cho dù case đó không thỏa mãn. Việc thực hiện khối switch sẽ chỉ dừng khi gặp break hoặc đến khi kết thúc khối switch.
- Tại mỗi thời điểm thường thì chỉ có một case của switch được thực hiện.
- Nếu sau khi tất cả các case được đánh giá mà không có case nào được thực hiện, khối default sẽ được thực hiện. Kết thúc khối default không cần có break nhưng bạn có thể thêm vào. default luôn ở sau cùng cấu trúc switch.
Switch expression
- Từ phiên bản Java 12 ta có thể sử dụng biểu thức switch ở chế độ preview. Sau đó nó được hỗ trợ chính thức trong Java từ phiên bản Java 14.
- Cú pháp tổng quát của switch expression:
switch (variable) {
case value1 -> {
// làm gì đó nếu trường hợp này xảy ra
// yield value; trả về giá trị của case này.
}
case value2 -> {
// làm gì đó nếu trường hợp này xảy ra
// yield value; trả về giá trị của case này.
}
case value3 -> {
// làm gì đó nếu trường hợp này xảy ra
// yield value; trả về giá trị của case này.
}
...
default -> // làm gì đó nếu trường hợp này xảy ra
}
- Từ cấu trúc trên ta có thể gán giá trị của biểu thức switch cho một biến nào đó:
var someVariable = switch (variable) {
case value1 -> {
// làm gì đó nếu trường hợp này xảy ra
// yield value; trả về giá trị của case này.
}
case value2 -> {
// làm gì đó nếu trường hợp này xảy ra
// yield value; trả về giá trị của case này.
}
case value3 -> {
// làm gì đó nếu trường hợp này xảy ra
// yield value; trả về giá trị của case này.
}
...
default -> // làm gì đó nếu trường hợp này xảy ra
};
- Về cơ bản thì biểu thức switch giống với câu lệnh switch truyền thống tuy nhiên có một số khác biệt như sau:
- Ta có thể trả về giá trị từ biểu thức switch còn câu lệnh switch thì KHÔNG.
- Với các câu lệnh đơn ta viết các lệnh cần thực thi của mỗi case sau dấu mũi tên -> thay vì dấu hai chấm.
- Với các câu lệnh phức tạp, ta để đoạn code cần thực thi trong khối lệnh bao bởi ngoặc { } sau mũi tên.
- Để trả về giá trị từ các case trong biểu thức switch ta sử dụng keyword yield.
- Ta không cần sử dụng break để kết thúc mỗi case của biểu thức switch.
- Ta có thể đánh giá nhiều giá trị trong mỗi case với biểu thức switch.
- Nếu giá trị đánh giá là enum, ta không cần tới nhãn default trong biểu thức switch.
- Nếu giá trị đánh giá không phải enum, ta phải cung cấp nhãn default trong biểu thức switch.
- Ví dụ:
import java.util.Scanner;
public class Lesson32 {
public static void main(String[] args) {
// sử dụng switch expression
var scanner = new Scanner(System.in);
System.out.println("Nhập hai số a, b cách nhau một vài khoảng trắng: ");
var a = scanner.nextDouble();
var b = scanner.nextDouble();
System.out.println("===========> Các lựa chọn <===========");
System.out.println("1. Cộng hai số.");
System.out.println("2. Trừ a cho b.");
System.out.println("3. Nhân hai số.");
System.out.println("4. Chia a cho b.");
System.out.println("0. Thoát chương trình.");
System.out.println("Xin mời bạn lựa chọn: ");
var choice = scanner.nextInt();
switch (choice) {
case 0 -> System.out.println("==> Chương trình kết thúc.");
case 1 -> {
var sum = a + b;
System.out.println(STR."{a} + {b} = {sum}");
}
case 2 -> {
var diff = a - b;
System.out.println(STR."{a} - {b} = {diff}");
}
case 3 -> {
var prod = a * b;
System.out.println(STR."{a} * {b} = {prod}");
}
case 4 -> {
var quot = a / b;
System.out.println(STR."{a} / {b} = {quot}");
}
default -> System.out.println("==> Sai chức năng. Vui lòng chọn lại!");
}
}
}
Nhập hai số a, b cách nhau một vài khoảng trắng:
2.69 36.54
===========> Các lựa chọn <===========
1. Cộng hai số.
2. Trừ a cho b.
3. Nhân hai số.
4. Chia a cho b.
0. Thoát chương trình.
Xin mời bạn lựa chọn:
3
2.69 * 36.54 = 98.2926
- Các ví dụ phần dưới đây tiếp tục sử dụng các tính năng của biểu thức switch.
Sơ đồ khối
- Sau đây là sơ đồ khối tổng quát của cấu trúc switch:

Ví dụ minh họa
- Ví dụ 1: Một mùa của năm chỉ có thể là xuân, hạ, thu và đông. Yêu cầu nhập vào tên mùa tiếng Anh và đưa ra màn hình tên mùa tương ứng bằng tiếng Việt.
- Các khả năng có thể của input:
- input = “spring” => output là “Mùa Xuân”.
- input = “summer” => output là “Mùa Hạ”.
- input = “fall” => output là “Mùa Thu”.
- input = “winter” => output là “Mùa Đông”.
- input là các giá trị khác => output sẽ là “INVALID”.
- Sơ đồ khối xử lý các trường hợp kể trên:
- Các khả năng có thể của input:

- Code mẫu triển khai biểu thức switch truyền thống:
import java.util.Scanner;
public class Lesson32 {
public static void main(String[] args) {
var scanner = new Scanner(System.in);
System.out.println("Nhập tên mùa trong tiếng Anh: ");
var season = scanner.nextLine().trim().toLowerCase();
String currentSeason;
switch (season) {
case "spring":
currentSeason = "Mùa Xuân";
break;
case "summer":
currentSeason = "Mùa Hạ";
break;
case "fall":
case "autumn":
currentSeason = "Mùa Thu";
break;
case "winter":
currentSeason = "Mùa Đông";
break;
default:
currentSeason = "INVALID";
}
System.out.println(STR."Tiếng Anh: {season} => Tiếng Việt: {currentSeason}");
}
}
Nhập tên mùa trong tiếng Anh:
Summer
Tiếng Anh: summer => Tiếng Việt: Mùa Hạ
===
Nhập tên mùa trong tiếng Anh:
winter
Tiếng Anh: winter => Tiếng Việt: Mùa Đông
===
Nhập tên mùa trong tiếng Anh:
season
Tiếng Anh: season => Tiếng Việt: INVALID
- Code mẫu triển khai sử dụng phiên bản biểu thức switch:
import java.util.Scanner;
public class Lesson32 {
public static void main(String[] args) {
var scanner = new Scanner(System.in);
System.out.println("Nhập tên mùa trong tiếng Anh: ");
var season = scanner.nextLine().trim().toLowerCase();
String currentSeason = switch (season) {
case "spring" -> "Mùa Xuân";
case "summer" -> "Mùa Hạ";
case "fall", "autumn" -> "Mùa Thu";
case "winter" -> "Mùa Đông";
default -> "INVALID";
};
System.out.println(STR."Tiếng Anh: {season} => Tiếng Việt: {currentSeason}");
}
}
Nhập tên mùa trong tiếng Anh:
fall
Tiếng Anh: fall => Tiếng Việt: Mùa Thu
- Lưu ý rằng đây chỉ là 1 cách làm. Với mỗi vấn đề đưa ra bạn có nhiều cách làm khác nhau miễn là cách làm đó phù hợp và đưa ra được đáp án.
- Ví dụ 2: Viết chương trình cho phép người dùng nhập vào 2 số nguyên và các lựa chọn từ 0-4 và thực hiện các chức năng tương ứng như sau:
- 0: thoát chương trình
- 1: cộng hai số
- 2: trừ hai số
- 3: nhân hai số
- 4: chia hai số
- Sau đây là sơ đồ khối phần xử lý logic chính của bài tập trên:
- Code mẫu:
import java.util.Scanner;
public class Lesson32 {
public static void main(String[] args) {
// sử dụng switch statement
var scanner = new Scanner(System.in);
System.out.println("Nhập hai số a, b cách nhau một vài khoảng trắng: ");
var a = scanner.nextDouble();
var b = scanner.nextDouble();
System.out.println("===========> Các lựa chọn <===========");
System.out.println("1. Cộng hai số.");
System.out.println("2. Trừ a cho b.");
System.out.println("3. Nhân hai số.");
System.out.println("4. Chia a cho b.");
System.out.println("0. Thoát chương trình.");
System.out.println("Xin mời bạn lựa chọn: ");
var choice = scanner.nextInt();
switch (choice) {
case 0:
System.out.println("==> Chương trình kết thúc.");
break;
case 1:
var sum = a + b;
System.out.println(STR."{a} + {b} = {sum}");
break;
case 2:
var diff = a - b;
System.out.println(STR."{a} - {b} = {diff}");
break;
case 3:
var prod = a * b;
System.out.println(STR."{a} * {b} = {prod}");
break;
case 4:
var quot = a / b;
System.out.println(STR."{a} / {b} = {quot}");
break;
default:
System.out.println("==> Sai chức năng. Vui lòng chọn lại!");
}
}
}
Nhập hai số a, b cách nhau một vài khoảng trắng:
1.25 3.66
===========> Các lựa chọn <===========
1. Cộng hai số.
2. Trừ a cho b.
3. Nhân hai số.
4. Chia a cho b.
0. Thoát chương trình.
Xin mời bạn lựa chọn:
1
1.25 + 3.66 = 4.91
===
Nhập hai số a, b cách nhau một vài khoảng trắng:
1.25 3.66
===========> Các lựa chọn <===========
1. Cộng hai số.
2. Trừ a cho b.
3. Nhân hai số.
4. Chia a cho b.
0. Thoát chương trình.
Xin mời bạn lựa chọn:
4
1.25 / 3.66 = 0.34153005464480873
===
1.25 3.66
===========> Các lựa chọn <===========
1. Cộng hai số.
2. Trừ a cho b.
3. Nhân hai số.
4. Chia a cho b.
0. Thoát chương trình.
Xin mời bạn lựa chọn:
9
==> Sai chức năng. Vui lòng chọn lại!
- Code mẫu sử dụng switch expression:
import java.util.Scanner;
public class Lesson32 {
public static void main(String[] args) {
// sử dụng switch expression
var scanner = new Scanner(System.in);
System.out.println("Nhập hai số a, b cách nhau một vài khoảng trắng: ");
var a = scanner.nextDouble();
var b = scanner.nextDouble();
System.out.println("===========> Các lựa chọn <===========");
System.out.println("1. Cộng hai số.");
System.out.println("2. Trừ a cho b.");
System.out.println("3. Nhân hai số.");
System.out.println("4. Chia a cho b.");
System.out.println("0. Thoát chương trình.");
System.out.println("Xin mời bạn lựa chọn: ");
var choice = scanner.nextInt();
var result = switch (choice) {
case 0 -> "==> Chương trình kết thúc.";
case 1 -> {
var sum = a + b;
yield STR."{a} + {b} = {sum}";
}
case 2 -> {
var diff = a - b;
yield STR."{a} - {b} = {diff}";
}
case 3 -> {
var prod = a * b;
yield STR."{a} * {b} = {prod}";
}
case 4 -> {
var quot = a / b;
yield STR."{a} / {b} = {quot}";
}
default -> "==> Sai chức năng. Vui lòng chọn lại!";
};
System.out.println(result);
}
}
Nhập hai số a, b cách nhau một vài khoảng trắng:
1.25 3.66
===========> Các lựa chọn <===========
1. Cộng hai số.
2. Trừ a cho b.
3. Nhân hai số.
4. Chia a cho b.
0. Thoát chương trình.
Xin mời bạn lựa chọn:
6
==> Sai chức năng. Vui lòng chọn lại!
Bài tập thực hành
Đề bài đầy đủ: nhấn vào đây
Lời giải mẫu: nhấn vào đây


