Skip to Sidebar Skip to Content
اقرأ-تك اقرأ-تك
ضيفنا الكريم

  • قائمة القراءة
  • تسجيل الدخول
  • الرئيسية
  • المقالات
  • خطط الاشتراك
  • - اصدارتنا
  • ورقة وقلم
  • مدونات فطين
  • شنطة مبرمج
  • النشرة الأسبوعية
  • كنوز
  • - تعرف علينا
  • من نحن
  • الشراكات
  • كتاب المحتوى
  • اكتب معنا
  • تواصل معنا
  • - بنود الخدمة
  • سياسة الخصوصية
  • الشروط والأحكام
الوسوم
  • Backend
  • Distributed Systems
  • System Design
  • Databases
  • LinkedIn
  • X
  • Facebook
  • Telegram
  • GitHub
جميع الحقوق محفوظة لمنصة اقرأ-تِك 2024©

Full Guide Into Optionals in Java

  • Mahmoud Youssef by Mahmoud Youssef
    Mahmoud Youssef Mahmoud Youssef
    CEO & Founder
    • X
    • Facebook
    • Website
  • •
  • 16 Dec, 2023
  • •
  • 4 min read
  • Share on X
  • Share on Facebook
  • Share on LinkedIn
  • Share on Pinterest
  • Email
Full Guide Into Optionals in Java
Full Guide Into Optionals in Java
  • Clean Code
  • Object Oriented Programming
  • Programming Language
  • Refactoring

حيث أن الـ Java من لغات البرمجة الرائدة واللي بتشتهر بقوتها ومرونتها ومستمرة في سعيها لتحسين تجربة المبرمجين وانها تخلي الـ Code أكثر اتقان، ومن ضمن المميزات الكتيرة اللي ضافتها وخصوصًا في الـ Java 8 هي الـ Optional.

Optional Type

الـ Optional هي Type جديد ظهر لأول مرة في الـ Java 8 واللي كان هدفه الأساسي انه يمثل هل الـ Value موجودة ولا لا ؟ بمعنى تاني الـ Optional Object ده ممكن يكون شايل جواه Non-Nullable Value ووقتها هيكون بيمثل فيه Value Present أو شايل جواه Nullable Value ووقتها هيكون بيمثل Empty Value. 

بشكل تاني ممكن نعتبر الـ Optional ده Wrapper أو Container بيشيل جواه الـ Value وبيقدملك مميزات قوية تقدر تتعامل بيها مع الـ Value دي بشكل سهل و Readable من غير تعقيدات سواء كانت Non-Nullable يعني Present أو Nullable بمعنى انه Empty.

طب ايه شكل الـ Optional ؟

public class Main {

    public static void main(String[] args) {
        Optional<ArticleDto> articleDtoOptional = Optional.ofNullable(getArticleById(UUID.randomUUID().toString()));
        System.out.println(articleDtoOptional.isPresent()); // false

        // Throws NullPointerException & Compiler Requires NonNull Value
        Optional<ArticleDto> article = Optional.of(getArticleById(UUID.randomUUID().toString()));
        System.out.println(article.isEmpty());

        Optional<String> authorName = Optional.of("Mahmoud Youssef");
        System.out.println(authorName.isPresent()); // true
        System.out.println(authorName.isEmpty()); // false
    }

    private static ArticleDto getArticleById(String articleId) {
        return null;
    }
}

الـ Optional ليها كذا طريقة عشان تعرفها ، اما من خلال Optional.of واللي بتاخد جواها قيمة غير Nullable وده لإنها بتـ Throw NullPointerException في الـ RunTime وفي الـ Compile Time بتحتاج Non-Null ، يا اما Optional.ofNullable واللي ممكن تاخد جواها قيمة Nullable.

أو من خلال استخدام الـ Declarative Programming Paradigm من خلال الـ Streams واللي بتتيح أكتر من Function بترجع Optional Object زي انك مثلا تدور في List من المقالات وتقول انا عاوز أول مقال بيحقق الشرط ده ويا اما المقال هيبقى موجود يا اما لا .. وهي دي ببساطة فكرة الـ Optional هي جواه Value يا لا. 

public class EqraatechClient {
    private List<ArticleDto> articles = List.of(
            new ArticleDto(UUID.randomUUID().toString(), "Recursion Deep Dive",
                    "Ahmed Anwar", "https://eqraatech.com/recursion-deep-dive"),
            new ArticleDto(UUID.randomUUID().toString(), "Artificial Neural Networks",
                    "Ahmed Mahmoud", "https://eqraatech.com/artificial-neural-networks"),
            new ArticleDto(UUID.randomUUID().toString(), "Records in C#",
                    "Mohamed Magdi", "https://eqraatech.com/records-in-c#"),
            new ArticleDto(UUID.randomUUID().toString(), "Rate Limiting In a Nutshell",
                    "Alaa Elkazaz", "https://eqraatech.com/rate-limiting-in-a-nutshell"),
            new ArticleDto(UUID.randomUUID().toString(), "Java Optional Full Guide",
                    "Mahmoud Youssef", "https://eqraatech.com/java-optional-full-guide")
    );

    public Optional<ArticleDto> getArticleById(String uuid) {
        return articles.stream()
                .filter(article -> article.uuid().equalsIgnoreCase(uuid))
                .findFirst();
    }
}

Copy

بكده عرفنا شكل الـ Optional وعرفنا ممكن نشوفها ازاي في الـ Code بمقدمة بسيطة، وعرفنا انها Wrapper بيشيل جواه Object أو لا. تعالوا نشوف باه مدى قوة الـ Optional في الـ Code Readability والـ Clean Code.

Optional Features

شوفنا في الأمثلة السابقة ان عندنا isEmpty و isPresent ودول بيمثلوا اذا كان الـ Optional شايل جواه Null يعني Empty ولا جواه قيمة فعلية ووقتها Present.

1- ifPresnetOrElse

عشان نفهم أهمية الـ Optional ومدى قوتها في التطبيق العملي ليها, خلونا نشوف المثال ده: 

public class ArticleService {

    private final EqraatechClient eqraatechClient;

    public ArticleService(EqraatechClient eqraatechClient) {
        this.eqraatechClient = eqraatechClient;
    }

    // without optional
    public void sendNotificationsAboutMetaDataUpdates(String articleId) {
        ArticleMetaDataDto articleMetaDataDto = eqraatechClient.getArticleMetaDataByArticleId(articleId);
        if (articleMetaDataDto == null) {
            System.out.println("There is no metadata created for this article yet!");
            return;
        }
        System.out.println("Sending email about changes to owner...");
    }

    // with optional
    public void sendNotificationsAboutMetaDataUpdatesWithOptional4(String articleId) {
        eqraatechClient.getArticleMetaDataByArticleIdWithOptional(articleId)
                .ifPresentOrElse(articleMetaDataDto -> System.out.println("Sending email about changes to owner..."), () -> System.out.println("There is no metadata created for this article yet!"));
    }

}

في المثال اللي فات ده احنا كنا بنستخدم الـ EqraatechClient عشان نبعت Request ونـ Fetch Article MetaData ، وبنحاول نشوف لو كانت موجودة، ده معناه اننا عاوزين نبعت Email للـ Owner ولو مش موجودة فهنبعت Logs أو نعمل أي Logic تاني مختلف. 

لو بصينا على الـ Optional هنلاقي انها Readable أكتر ومش محتاج كل شوية اعمل Null Checks لاني ممكن انساها .. واللي هتخلي الكود طويل على الفاضي. 

ده كان استخدام بسيط جدًا للـ Optional واللي ممكن تعتمد عليه دايما بعد كده بدل الـ If Conditions اللي هتقعد تحطها في كل مكان.

هذا المقال مخصص للأعضاء فقط

اشترك الآن وتصفح كافة المقالات المميزة واستمتع بمحتوى حصري وابق على اطلاع دائم بالتحديثات المستمرة.

اشترك الآن 🚀

هل لديك حساب؟ تسجيل الدخول

في هذا المقال
اشترك الآن واكمل قراءة المقال
قناة اقرأ-تِك على التليجرام قناة اقرأ-تِك على التليجرام

اشترك الآن بنشرة اقرأ‑تِك الأسبوعية

لا تدع أي شيء يفوتك. واحصل على أحدث المقالات المميزة مباشرة إلى بريدك الإلكتروني وبشكل مجاني!

مقالات ذات صلة

  • Introduction Into Logging and Monitoring in .NET 1 min read

    Introduction Into Logging and Monitoring in .NET

    Alaa Nassar Alaa Nassar • 4 Dec, 2024
    Alaa Nassar Alaa Nassar
    DotNet Developer
    • Website
  • Deep Dive into Code Quality - Beyond Bugs 5 min read

    Deep Dive into Code Quality - Beyond Bugs

    Rowan Ibrahem Rowan Ibrahem • 1 Sep, 2024
    Rowan Ibrahem Rowan Ibrahem
    Flutter Developer
    • Website
  • The Seam Model: Legacy Code #04 3 min read

    The Seam Model: Legacy Code #04

    Mahmoud Youssef Mahmoud Youssef • 27 Jun, 2024
    Mahmoud Youssef Mahmoud Youssef
    CEO & Founder
    • X
    • Facebook
    • Website
  • Sensing and Separation: Legacy Code #03 2 min read

    Sensing and Separation: Legacy Code #03

    Mahmoud Youssef Mahmoud Youssef • 27 Jun, 2024
    Mahmoud Youssef Mahmoud Youssef
    CEO & Founder
    • X
    • Facebook
    • Website
  • Working With Feedbacks: Legacy Code #02 2 min read

    Working With Feedbacks: Legacy Code #02

    Mahmoud Youssef Mahmoud Youssef • 27 Jun, 2024
    Mahmoud Youssef Mahmoud Youssef
    CEO & Founder
    • X
    • Facebook
    • Website
  • Changing Software: Legacy Code #01 2 min read

    Changing Software: Legacy Code #01

    Mahmoud Youssef Mahmoud Youssef • 26 Jun, 2024
    Mahmoud Youssef Mahmoud Youssef
    CEO & Founder
    • X
    • Facebook
    • Website
  • Observer Design Pattern 3 min read

    Observer Design Pattern

    Mahmoud Youssef Mahmoud Youssef • 22 Jun, 2024
    Mahmoud Youssef Mahmoud Youssef
    CEO & Founder
    • X
    • Facebook
    • Website
  • Refactoring : Improving The Design of Existing Code Book Recommendation

    Refactoring : Improving The Design of Existing Code Book Recommendation

    Mahmoud Youssef Mahmoud Youssef • 17 Oct, 2023
    Mahmoud Youssef Mahmoud Youssef
    CEO & Founder
    • X
    • Facebook
    • Website
  • Deep Dive Into Code Review Checklist 1 min read

    Deep Dive Into Code Review Checklist

    Hanan Shaban Hanan Shaban • 9 Jul, 2023
    Hanan Shaban Hanan Shaban
    Program Manager
    • Website
  • Clean Code, Comments & The Clean The Ugly 2 min read

    Clean Code, Comments & The Clean The Ugly

    Ibrahim Abou Elenein Ibrahim Abou Elenein • 2 Jul, 2023
    Ibrahim Abou Elenein Ibrahim Abou Elenein
    Software Engineer
    • Website
اقرأ-تك اقرأ-تك
  • الرئيسية
  • المقالات
  • خطط الاشتراك
  • - اصدارتنا
  • ورقة وقلم
  • مدونات فطين
  • شنطة مبرمج
  • النشرة الأسبوعية
  • كنوز
  • - تعرف علينا
  • من نحن
  • الشراكات
  • كتاب المحتوى
  • اكتب معنا
  • تواصل معنا
  • - بنود الخدمة
  • سياسة الخصوصية
  • الشروط والأحكام
الوسوم
  • Backend
  • Distributed Systems
  • System Design
  • Databases
  • LinkedIn
  • X
  • Facebook
  • Telegram
  • GitHub
جميع الحقوق محفوظة لمنصة اقرأ-تِك 2024©