إنشاء Optional وفحصه
استخدم Optional.of وofNullable وempty وisPresent وisEmpty وget بأمان
إنشاء Optional وفحصه درس مجاني في Java Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Java Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Java Academy 4 دروس في المجموع.
إنشاء Optionals وفحصها
يغطي هذا الدرس الدوال اللازمة لإنشاء مثيلات Optional وفحص محتوياتها: isPresent وisEmpty وget والبدائل الآمنة.
ثلاث طرق لإنشاء Optional
أنشئ Optional باستخدام Optional.of() أو Optional.ofNullable() أو Optional.empty().
import java.util.Optional;
// 1. of: must be non-null
Optional<String> a = Optional.of("hello");
// 2. ofNullable: safely wraps null
String maybeNull = null;
Optional<String> b = Optional.ofNullable(maybeNull); // empty
Optional<String> c = Optional.ofNullable("world"); // present
// 3. empty: explicitly empty
Optional<Integer> empty = Optional.empty();
System.out.println(a.isPresent()); // true
System.out.println(b.isPresent()); // false
System.out.println(c.isEmpty()); // falseisPresent وisEmpty
تعيد isPresent() القيمة true إذا كانت هناك قيمة. أما isEmpty() (في Java 11 وما بعدها) فهي عكسها المنطقي.
import java.util.Optional;
Optional<String> opt = Optional.of("Java");
System.out.println(opt.isPresent()); // true
System.out.println(opt.isEmpty()); // false
Optional<String> empty = Optional.empty();
System.out.println(empty.isPresent()); // false
System.out.println(empty.isEmpty()); // true
// Prefer ifPresent() over if (isPresent()) get() — more readable
opt.ifPresent(v -> System.out.println(v.toUpperCase())); // JAVAget(): استخدمها بحذر
تعيد get() القيمة أو ترمي NoSuchElementException. لا تستدعها أبدًا من دون التحقق أولًا.
import java.util.Optional;
Optional<String> opt = Optional.of("present");
System.out.println(opt.get()); // present
Optional<String> empty = Optional.empty();
try {
empty.get(); // NoSuchElementException!
} catch (java.util.NoSuchElementException e) {
System.out.println("No value!");
}
// Better pattern: always use orElse/orElseGet/orElseThrow
// instead of isPresent() + get()orElse وorElseGet
تعيد orElse(default) القيمة الافتراضية إذا كان Optional فارغًا. أما orElseGet(supplier) فتستدعي المورّد عند الحاجة فقط، ولذلك فهي أفضل للقيم الافتراضية المكلفة حسابيًا.
import java.util.Optional;
Optional<String> plan = Optional.empty();
// orElse: default value always evaluated
String basic = plan.orElse("FREE");
System.out.println(basic); // FREE
// orElseGet: supplier only called when empty (lazy)
String lazy = plan.orElseGet(() -> {
System.out.println("Computing default...");
return "FREE";
});
System.out.println(lazy); // Computing default... FREE
// When present, orElseGet supplier is NOT called
Optional.of("PRO").orElseGet(() -> {
System.out.println("Not called!");
return "FREE";
}); // silent — present, no computation neededorElseThrow
ترمي orElseThrow() استثناء NoSuchElementException أو استثناءً مخصصًا إذا كان Optional فارغًا. استخدمها عندما يكون الغياب خطأً حقيقيًا.
import java.util.Optional;
Optional<String> userId = Optional.empty();
// Default: throws NoSuchElementException
try {
userId.orElseThrow();
} catch (java.util.NoSuchElementException e) {
System.out.println("Empty!");
}
// Custom exception
try {
userId.orElseThrow(() -> new IllegalStateException("User ID required"));
} catch (IllegalStateException e) {
System.out.println(e.getMessage()); // User ID required
}ifPresent وifPresentOrElse
تتيح لك هاتان الدالتان تنفيذ إجراء على القيمة من دون استخراجها. وهما مناسبتان للتأثيرات الجانبية الواضحة.
import java.util.Optional;
Optional<String> username = Optional.of("alice");
// ifPresent: callback only when present
username.ifPresent(u -> System.out.println("Welcome, " + u));
// Welcome, alice
Optional<String> missing = Optional.empty();
// ifPresentOrElse (Java 9+): callback or else action
missing.ifPresentOrElse(
u -> System.out.println("Hello " + u),
() -> System.out.println("Anonymous user")
);
// Anonymous userالتحقق من وجود String
من حالات الاستخدام الشائعة: إرجاع قيمة افتراضية عندما تكون سلسلة إعدادات غائبة أو فارغة.
import java.util.Optional;
static Optional<String> getConfig(String key) {
// Simulate config lookup
return Optional.ofNullable(System.getenv(key));
}
String port = getConfig("PORT").orElse("8080");
String host = getConfig("HOST").orElse("localhost");
System.out.println("Server: " + host + ":" + port);
// Server: localhost:8080 (when env vars not set)Optional.or() للـ Optionals البديلة
تعيد or() (في Java 9 وما بعدها) الـ Optional نفسه إذا كان يحتوي على قيمة، أو Optional آخر يوفره مورّد.
import java.util.Optional;
static Optional<String> findInCache(String key) { return Optional.empty(); }
static Optional<String> findInDatabase(String key) { return Optional.of("Alice"); }
Optional<String> result = findInCache("user:1")
.or(() -> findInDatabase("user:1"));
System.out.println(result.get()); // Alice
// Useful for fallback chains:
Optional<String> value = Optional.empty()
.or(() -> Optional.empty())
.or(() -> Optional.of("final fallback"));
System.out.println(value.get()); // final fallbackFilter للحضور المشروط
تُبقي filter(predicate) على القيمة فقط إذا استوفت الـ predicate، وإلا أعادت Optional فارغًا.
import java.util.Optional;
Optional<Integer> age = Optional.of(17);
Optional<Integer> adult = age.filter(a -> a >= 18);
System.out.println(adult.isPresent()); // false (17 is not >= 18)
Optional<Integer> age2 = Optional.of(25);
Optional<Integer> adult2 = age2.filter(a -> a >= 18);
System.out.println(adult2.get()); // 25
// Chain: find active premium user
Optional<User> premiumActive = findUser(id)
.filter(u -> "PRO".equals(u.plan()))
.filter(u -> u.isActive());تطبيق عملي: البحث عن مستخدم مع بديل
دمج isPresent وorElse وifPresentOrElse في سيناريو واقعي للبحث عن مستخدم.
import java.util.Optional;
record User(long id, String name, String email) {}
static Optional<User> findById(long id) {
return id == 1 ? Optional.of(new User(1, "Alice", "alice@co.com"))
: Optional.empty();
}
static void displayUser(long id) {
findById(id).ifPresentOrElse(
u -> System.out.println("Found: " + u.name() + " <" + u.email() + ">"),
() -> System.out.println("User " + id + " not found")
);
}
displayUser(1); // Found: Alice <alice@co.com>
displayUser(99); // User 99 not foundتحقق سريع
ما الذي تفعله orElseGet() بشكل مختلف عن orElse()؟
مراجعة: إنشاء Optionals وفحصها
أهم النقاط:
- يتطلب Optional.of() قيمة غير null، بينما يقبل Optional.ofNullable() القيمة null
- تفحص isPresent() وisEmpty() وجود القيمة؛ وتجنب استدعاء get() من دون فحص
- استخدم orElse() للقيم الافتراضية غير المكلفة، وorElseGet() للقيم الافتراضية المحسوبة والمكلفة
- استخدم orElseThrow() عندما يكون الغياب خطأً
- استخدم ifPresent() وifPresentOrElse() للتأثيرات الجانبية من دون استخراج القيمة
- تُبقي filter() على القيمة فقط إذا اجتازت الـ predicate، بينما تربط or() بين Optionals البديلة
الأسئلة الشائعة
هل درس «إنشاء Optional وفحصه» مجاني؟
نعم — نص درس «إنشاء Optional وفحصه» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Java Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Java Academy 4 دروس في المجموع.
ماذا ستتعلم في «إنشاء Optional وفحصه»؟
استخدم Optional.of وofNullable وempty وisPresent وisEmpty وget بأمان تتمرن على Java Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Java Academy؟
لا تُشترط خبرة سابقة. Java Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «إنشاء Optional وفحصه»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Java Academy هذا؟
نعم. كل درس في Java Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- سبب وجود Optional
- إنشاء Optional وفحصه
- تحويل Optional: map وflatMap
- أفضل ممارسات Optional