0Pricing
Java Academy · درس

إنشاء 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());   // false

isPresent و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())); // JAVA

get(): استخدمها بحذر

تعيد 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 needed

orElseThrow

ترمي 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 fallback

‏Filter للحضور المشروط

تُبقي 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 يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. سبب وجود Optional
  2. إنشاء Optional وفحصه
  3. تحويل Optional: ‏map وflatMap
  4. أفضل ممارسات Optional
← العودة إلى Java Academy