So khớp mẫu
Thuộc phần Logic và luồng chương trình trong hành trình Java của Coddy. Bài học 37 trên 59.
Đối sánh mẫu trong Java cho phép bạn kiểm tra xem một đối tượng có kiểu cụ thể hay không và trích xuất các thành phần từ đối tượng đó. Cách này giúp đơn giản hóa thao tác kiểm tra kiểu dữ liệu và ép kiểu.
Hãy xem cách dùng so khớp mẫu với instanceof:
Object obj = "Hello";
if (obj instanceof String str) {
// str tự động được ép kiểu thành String
System.out.println(str.toUpperCase());
}Sau khi chạy đoạn code trên, đầu ra là:
"HELLO"
Bạn cũng có thể nối các bước kiểm tra khớp mẫu bằng else if:
Object value = 42;
String result;
if (value instanceof Integer i) {
result = "Number: " + i;
} else if (value instanceof String s) {
result = "Text: " + s;
} else {
result = "Unknown";
}Sau khi chạy đoạn code trên, result chứa:
“Number: 42”
Thử thách
DễTạo một phương thức tên là processValue nhận một đối số:
- Một đối tượng Object (
value) có thể thuộc nhiều kiểu dữ liệu khác nhau
Phương thức này nên dùng khớp mẫu với instanceof để xử lý giá trị và trả về một chuỗi theo các quy tắc sau:
- Nếu đó là Integer: trả về "Number: " theo sau là giá trị được nhân đôi
- Nếu đó là String: trả về "Text: " theo sau là giá trị được viết hoa
- Nếu đó là Boolean: trả về "Boolean: " theo sau là giá trị đối lập (true trở thành false và ngược lại)
- Với mọi kiểu dữ liệu khác: trả về "Unknown"
Tự làm thử
import java.util.Scanner;
public class Main {
public static String processValue(Object value) {
// TODO: Dùng pattern matching với instanceof để xử lý giá trị
// Nếu là Integer: trả về "Number: " + (value * 2)
// Nếu là String: trả về "Text: " + value.toUpperCase()
// Nếu là Boolean: trả về "Boolean: " + (!value)
// Với mọi kiểu khác: trả về "Unknown"
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String type = scanner.nextLine();
String inputValue = scanner.nextLine();
Object value = switch(type) {
case "Integer" -> Integer.parseInt(inputValue);
case "String" -> inputValue;
case "Boolean" -> Boolean.parseBoolean(inputValue);
default -> inputValue;
};
System.out.println(processValue(value));
}
}Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Tất cả bài học trong Logic và luồng chương trình
1Mảng đa chiều
Kiến thức cơ bản về mảng 2DTruy cập phần tử trong mảng 2DVòng lặp lồng nhau với mảng 2DÔn tập về mảng 2DPhép cộng và phép trừ ma trậnMảng không đềuMảng 3D trở lênCác mẫu thường gặp với mảng 2DÔn tập về mảng2HashMap phần 1
HashMap là gì?Khai báo HashMapTruy cập giá trịKiểm tra khóa có tồn tạiChỉnh sửa từ điểnÔn tập: HashMap3HashMap phần 2
Phương thức của HashMapDuyệt bằng keySet()Duyệt bằng entrySet()HashMap lồng nhauÔn tập: Quản lý kho hàngÔn tập: Thao tác với HashMap6Luồng điều khiển nâng cao
Câu lệnh nhãnBiểu thức switchSo khớp mẫuMệnh đề bảo vệÔn tập: luồng điều khiểnTự luyện tập: Trình biên dịch Java online