مطابقة الأنماط
جزء من قسم Logic & Flow في رحلة Java على Coddy — الدرس 37 من 59.
تتيح لك مطابقة الأنماط (Pattern matching) في Java اختبار ما إذا كان الكائن له نوع معين واستخراج المكونات منه. فهي تبسط عمليات التحقق من النوع (type checking) وعمليات التحويل (casting).
دعونا نرى كيفية استخدام مطابقة الأنماط (pattern matching) مع instanceof:
Object obj = "Hello";
if (obj instanceof String str) {
// يتم تحويل str تلقائياً إلى String
System.out.println(str.toUpperCase());
}بعد تنفيذ الكود أعلاه، تكون المخرجات هي:
"HELLO"
يمكنك أيضاً استخدام مطابقة الأنماط في تعبيرات switch:
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";
}بعد تنفيذ الكود أعلاه، result يحتوي على:
“Number: 42”
التحدي
سهلأنشئ طريقة باسم processValue تأخذ وسيطًا واحدًا:
- كائن (
value) يمكن أن يكون من أنواع مختلفة
يجب أن تستخدم الطريقة مطابقة الأنماط (pattern matching) مع instanceof لمعالجة القيمة وإرجاع سلسلة نصية بناءً على هذه القواعد:
- إذا كان Integer: أرجع "Number: " متبوعًا بالقيمة مضاعفة
- إذا كان String: أرجع "Text: " متبوعًا بالقيمة بأحرف كبيرة
- إذا كان Boolean: أرجع "Boolean: " متبوعًا بالقيمة المعاكسة (true تصبح false والعكس صحيح)
- لأي نوع آخر: أرجع "Unknown"
ورقة مرجعية
تتيح لك مطابقة الأنماط (Pattern matching) في Java اختبار ما إذا كان الكائن له نوع معين واستخراج المكونات منه باستخدام instanceof:
Object obj = "Hello";
if (obj instanceof String str) {
// يتم تحويل str تلقائيًا إلى String
System.out.println(str.toUpperCase());
}يمكنك ربط عدة عمليات تحقق من مطابقة الأنماط:
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";
}جرّب بنفسك
import java.util.Scanner;
public class Main {
public static String processValue(Object value) {
// TODO: استخدم مطابقة الأنماط مع instanceof لمعالجة القيمة
// إذا كانت من نوع Integer: أرجع "Number: " + (value * 2)
// إذا كانت من نوع String: أرجع "Text: " + value.toUpperCase()
// إذا كانت من نوع Boolean: أرجع "Boolean: " + (!value)
// لأي نوع آخر: أرجع "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));
}
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Logic & Flow
1المصفوفات متعددة الأبعاد
أساسيات المصفوفات ثنائية الأبعادالوصول إلى عناصر المصفوفات ثنائية الأبعادالحلقات المتداخلة مع المصفوفات ثنائية الأبعادمراجعة - المصفوفات ثنائية الأبعادجمع وطرح المصفوفاتالمصفوفات المتعرجة (Jagged Arrays)المصفوفات ثلاثية الأبعاد وما بعدهاأنماط المصفوفات ثنائية الأبعاد الشائعةمراجعة - كل شيء عن المصفوفات2HashMap الجزء الأول
ما هو الـ HashMap؟تعريف الـ HashMapالوصول إلى القيمالتحقق من وجود المفتاحتعديل القواميسملخص - HashMap3HashMap الجزء الثاني
دوال HashMapالتكرار باستخدام keySet()التكرار باستخدام entrySet()HashMap متداخلمراجعة - إدارة المستودعمراجعة - عمليات HashMap6التحكم المتقدم في تدفق البرنامج
العبارات المعنونةتعبير Switchمطابقة الأنماطجمل الحمايةمراجعة - تدفق التحكم