JavaRush /مدونة جافا /Random-AR /التخلص من الحلقات في جافا 8
KapChook
مستوى
Volga

التخلص من الحلقات في جافا 8

نشرت في المجموعة
يعد النمط الوظيفي المقدم في Java 8 إضافة رائعة للغة. الآن Java ليست OOP خالصة، فهي الآن مزيج من OOP والبرمجة الوظيفية. هذا يغير قواعد اللعبة ونحن بحاجة إلى تغيير أدمغة OOP لدينا لاستيعاب هذه التغييرات. التخلص من الحلقات في Java 8 - 1ولكن لماذا يجب أن نقبل هذه التغييرات؟ لماذا يجب أن نضيع الوقت في محاولة التوافق مع الأسلوب الوظيفي بينما يمكننا حل المشكلة باستخدام OOP الخالص؟
  • يساعدنا النمط الوظيفي المقدم في Java 8 على تقليل الفجوة بين منطق الأعمال والتعليمات البرمجية. إنها تتيح لنا رواية القصة بتدفق طبيعي على مستوى أعلى. بدلاً من أن تقول كيف تريد أن تفعل ذلك، يمكنك أن تقول ما تريد أن تفعله.

  • يصبح الكود أنظف وأكثر إيجازًا.

  • وظائف الترتيب العالي تسمح لنا بما يلي:

    • إرسال الوظائف إلى وظائف أخرى
    • إنشاء وظائف داخل وظائف أخرى
    • إرجاع الوظائف من وظائف أخرى

    يعد هذا فوزًا كبيرًا لـ Java، حيث نحتاج إلى إرسال الكائنات وإنشائها وإعادتها للقيام بذلك. سنكون قادرين على كتابة تعليمات برمجية أكثر موثوقية وتركيزًا وأسهل في إعادة الاستخدام.

  • بفضل لامدا، يمكننا إجراء حسابات كسولة. عندما يتم إرسال تعبير لامدا كوسيطة أسلوب، سيقوم المترجم بتقييمه عند استدعائه في الأسلوب. وهذا يختلف عن وسيطات الطريقة العادية، والتي يتم تقييمها على الفور.

  • Lambdas تجعل اختبارات وحدة الكتابة ممتعة. إنها تتيح لنا إنشاء اختبارات خفيفة الوزن ونظيفة وصغيرة الحجم وسريعة الكتابة. يمكننا استئصال الكود قيد الاختبار باستخدام lambdas. يتيح لنا ذلك اختبار مدى تأثير جميع أنواع السيناريوهات على الكود.

  • أنماط جديدة للتعلم.

  • وأكثر بكثير!

ولكن ما يكفي من الماء، في هذا المقال سوف نلقي نظرة على الحلول البديلة للدورات التقليدية. بالطبع، الدورات مرنة، لكن هذا لا يأتي بدون ثمن. break، يغير سلوك الحلقة بشكل كبير، مما يجبرنا على فهم ليس فقط ما تحاول الكود تحقيقه، continueولكن returnأيضًا فهم كيفية عمل الحلقة. سنلقي الآن نظرة على كيفية تحويل الحلقات إلى تعليمات برمجية أكثر إيجازًا وقابلية للقراءة.

دع الترميز يبدأ!

سوف نعمل مع المقالات. تحتوي المقالة على عنوان ومؤلف والعديد من العلامات.
private class Article {

    private final String title;
    private final String author;
    private final List<String> tags;

    private Article(String title, String author, List<String> tags) {
        this.title = title;
        this.author = author;
        this.tags = tags;
    }

    public String getTitle() {
        return title;
    }

    public String getAuthor() {
        return author;
    }

    public List<String> getTags() {
        return tags;
    }
}
سيحتوي كل مثال على حل تقليدي باستخدام الحلقات وحل باستخدام الميزات الجديدة لـ Java 8. في المثال الأول، نريد العثور على المقالة الأولى في المجموعة ذات العلامة "Java". دعونا نلقي نظرة على الحل باستخدام الحلقة.
public Article getFirstJavaArticle() {

    for (Article article : articles) {
        if (article.getTags().contains("Java")) {
            return article;
        }
    }
    return null;
}
الآن دعونا نحل المشكلة باستخدام العمليات من Stream API.
public Optional<Article> getFirstJavaArticle() {
    return articles.stream()
        .filter(article -> article.getTags().contains("Java"))
        .findFirst();
    }
رائع، أليس كذلك؟ نستخدم العملية أولاً filterللعثور على جميع المقالات ذات العلامة "Java"، ثم نستخدمها findFirst()للحصول على التواجد الأول. نظرًا لأن التدفقات كسولة ويقوم المرشح بإرجاع التدفق، فإن هذا الأسلوب سيعالج العناصر فقط حتى يجد التطابق الأول. الآن دعنا نحصل على جميع المقالات الموسومة بـ "Java" بدلاً من المقالة الأولى فقط. أولا الحل باستخدام الحلقات.
public List<Article> getAllJavaArticles() {

    List<Article> result = new ArrayList<>();

    for (Article article : articles) {
        if (article.getTags().contains("Java")) {
            result.add(article);
        }
    }
    return result;
}
الحل باستخدام عمليات الدفق.
public List<Article> getAllJavaArticles() {
    return articles.stream()
        .filter(article -> article.getTags().contains("Java"))
        .collect(Collectors.toList());
    }
في هذا المثال، استخدمنا عملية collectلتقصير الدفق الناتج، بدلاً من الإعلان عن مجموعة وإضافة الإدخالات المطابقة بشكل صريح. حتى الان جيدة جدا. حان الوقت للحصول على أمثلة من شأنها أن تجعل Stream API متألقًا حقًا. دعونا نجمع كل المقالات حسب المؤلف. كالعادة، نبدأ بحلها باستخدام الحلقات:
public Map<String, List<Article>> groupByAuthor() {

    Map<String, List<Article>> result = new HashMap<>();

    for (Article article : articles) {
        if (result.containsKey(article.getAuthor())) {
            result.get(article.getAuthor()).add(article);
        } else {
            ArrayList<Article> articles = new ArrayList<>();
            articles.add(article);
            result.put(article.getAuthor(), articles);
        }
    }
    return result;
}
هل يمكننا إيجاد حل نظيف لهذه المشكلة باستخدام عمليات الدفق؟
public Map<String, List<Article>> groupByAuthor() {
    return articles.stream()
        .collect(Collectors.groupingBy(Article::getAuthor));
}
مدهش! باستخدام العملية groupingByومرجع الطريقة getAuthor()، نحصل على تعليمات برمجية نظيفة وقابلة للقراءة. الآن دعنا نعثر على بقية العلامات المستخدمة في المجموعة. لنبدأ بمثال للحلقة:
public Set<String> getDistinctTags() {

    Set<String> result = new HashSet<>();

    for (Article article : articles) {
        result.addAll(article.getTags());
    }
    return result;
}
حسنًا، دعونا نلقي نظرة على كيفية حل هذه المشكلة باستخدام عمليات الدفق:
public Set<String> getDistinctTags() {
    return articles.stream()
        .flatMap(article -> article.getTags().stream())
        .collect(Collectors.toSet());
}
رائع! flatmapيساعدنا في تسوية قائمة العلامات في تدفق نتائج واحد، والذي نستخدمه بعد ذلك collectلإنشاء مجموعة الإرجاع.

احتمالات لا نهاية لها

كانت هذه 4 أمثلة لكيفية استبدال الحلقات بكود أكثر قابلية للقراءة. تأكد من إطلاعك على Stream API، حيث أن هذه المقالة لم تتطرق إلا إلى السطح. سيكون إتقان النمط الوظيفي الجديد لـ Java تحديًا لمطوري OOP، ولكنه تحدٍ يجب قبوله جيدًا. سأذهب إلى أبعد من ذلك وأقول أنه يجب عليك تعلم لغة برمجة وظيفية خالصة. بهذه الطريقة يمكنك فهم الإمكانات والقوة التي يوفرها بشكل كامل. أعتقد أن هذا سيساعدك على فهم البرمجة الوظيفية على مستوى آخر. لذا، تعلم البرمجة الوظيفية جنبًا إلى جنب مع OOP القديمة الجيدة، واستخدمهما لكتابة تعليمات برمجية أكبر! مزيج مجاني من ترجمات مقالتين - لماذا يجب عليك تبني البرمجة الوظيفية في Java 8 والانحراف بعيدًا عن الحلقات في Java 8
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION