JavaRush /مدونة جافا /Random-AR /جافا 8. كل ما تحتاجه
Roman Beekeeper
مستوى

جافا 8. كل ما تحتاجه

نشرت في المجموعة

جافا 8 البرنامج التعليمي

"جافا لا تزال على قيد الحياة وبدأ الناس في فهمها."
مرحبًا بك في مقدمتي لـ Java 8. ستأخذك هذه المقالة خطوة بخطوة عبر جميع الميزات الجديدة من Java 7 إلى Java 8. باستخدام أمثلة التعليمات البرمجية السريعة والبسيطة، يمكننا تعلم كيفية استخدام الواجهات الافتراضية ومراجع الأساليب و التعليقات التوضيحية المتكررة . في نهاية المقال سوف نتعرف على Stream API.
جافا 8. كل ما تحتاجه هو 1
لا توجد ثرثرة غير ضرورية - فقط التعليمات البرمجية والتعليقات! إلى الأمام!

الطرق الافتراضية للواجهات

يتيح لنا Java 8 إضافة أساليب غير مجردة (يتم تنفيذها) إلى الواجهات عن طريق إضافة ملحق default. تُعرف هذه الميزة أيضًا باسم طرق الامتداد . أدناه هو المثال الأول:
interface Formula {
    double calculate(int a);

    default double sqrt(int a) {
        return Math.sqrt(a);
    }
}
بالإضافة إلى الطريقة المجردة calculate، تحدد الواجهة Formulaأيضًا الطريقة الافتراضية sqrt. تحتاج الفئات التي تنفذ هذه الواجهة فقط إلى تنفيذ calculate. يمكن استخدام الطريقة الافتراضية sqrtخارج الصندوق.
Formula formula = new Formula() {
    @Override
    public double calculate(int a) {
        return sqrt(a * 100);
    }
};

formula.calculate(100);     // 100.0
formula.sqrt(16);           // 4.0
يتم تنفيذ الواجهة Formulaكفئة مجهولة. الكود زائد عن الحاجة: 6 أسطر للتنفيذ sqrt(a * 100). كما سنرى في القسم التالي، هناك طريقة أفضل لتنفيذ طريقة واحدة في Java 8.

تعبيرات لامدا

لنبدأ بمثال بسيط لفرز قائمة السلاسل في الإصدارات السابقة من Java:
List<String> names = Arrays.asList("peter", "anna", "mike", "xenia");

Collections.sort(names, new Comparator<String>() {
    @Override
    public int compare(String a, String b) {
        return b.compareTo(a);
    }
});
تقبل الطريقة الثابتة Collections.sortالقائمة والمقارنة بالترتيب الذي سيتم فرز القائمة به. يمكنك دائمًا إنشاء فئة مقارنة مجهولة وتمريرها. بدلاً من إنشاء فئة مجهولة، في Java 8، يمكنك كتابة نموذج أقصر، تعبير لامدا.
Collections.sort(names, (String a, String b) -> {
    return b.compareTo(a);
});
كما ترون فإن الكود أقصر بكثير وأسهل في القراءة. ولكن يمكن جعل هذا أقصر:
Collections.sort(names, (String a, String b) -> b.compareTo(a));
بالنسبة للنص الذي يحتوي على سطر واحد، يمكنك تخطي {}الكلمة return. ولكن يمكنك جعلها أقصر:
Collections.sort(names, (a, b) -> b.compareTo(a));
يعرف مترجم Java أنواع الوسائط، لذا يمكنك تخطيها أيضًا. دعونا نتعمق أكثر في تعبيرات لامدا ونفهم كيف يمكن استخدامها.

واجهات وظيفية

كيف تتناسب تعبيرات لامدا مع نظام نوع جافا؟ يتوافق كل لامدا مع النوع الموضح في الواجهة. لذلك، يجب أن تحتوي الواجهة الوظيفية على طريقة مجردة واحدة فقط. سيتوافق كل تعبير لامدا من هذا النوع مع هذه الطريقة المجردة. نظرًا لأن الطرق الافتراضية ليست مجردة، فلديك الحرية في إنشاء طرق افتراضية في الواجهات الوظيفية حسب الحاجة. يمكننا أيضًا استخدام واجهات عشوائية كتعبيرات لامدا إذا كان هناك طريقة مجردة واحدة فقط في هذه الواجهة. لتلبية هذه المتطلبات، تحتاج إلى إضافة @FucntionalInterfaceتعليق توضيحي. يعرف المترجم ذلك وسيطرح استثناءً إذا كنت تريد توفير أكثر من طريقة مجردة. مثال:
@FunctionalInterface
interface Converter<F, T> {
    T convert(F from);
}
Converter<String, Integer> converter = (from) -> Integer.valueOf(from);
Integer converted = converter.convert("123");
System.out.println(converted);    // 123
ضع في اعتبارك أن الكود سيتم تجميعه أيضًا إذا @FunctionalInterfaceتم حذف التعليق التوضيحي.

مراجع الطريقة والمنشئ

يمكن أيضًا تصغير المثال أعلاه باستخدام مراجع الطريقة:
Converter<String, Integer> converter = Integer::valueOf;
Integer converted = converter.convert("123");
System.out.println(converted);   // 123
يتيح لك Java 8 تمرير المراجع إلى طريقة أو مُنشئ عن طريق إضافة ::. يوضح المثال أعلاه كيف يمكننا الإشارة إلى طريقة ثابتة، على الرغم من أنه يمكننا أيضًا الإشارة إلى طرق غير ثابتة:
class Something {
    String startsWith(String s) {
        return String.valueOf(s.charAt(0));
    }
}
Something something = new Something();
Converter<String, String> converter = something::startsWith;
String converted = converter.convert("Java");
System.out.println(converted);    // "J"
دعونا نرى كيف ::يعمل مع الصانعين. للبدء، سوف نحدد فئة مثال مع منشئين مختلفين:
class Person {
    String firstName;
    String lastName;

    Person() {}

    Person(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }
}
بعد ذلك، سنحدد واجهة لإنشاء كائنات جديدة:
interface PersonFactory<P extends Person> {
    P create(String firstName, String lastName);
}
بدلًا من تنفيذ مصنع إنشاء، سنقوم بربط كل ذلك معًا ::بمساعدة المنشئ:
PersonFactory<Person> personFactory = Person::new;
Person person = personFactory.create("Peter", "Parker");
لقد أنشأنا رابطًا للمنشئ عبر Person::new. سيقوم مترجم Java تلقائيًا بتحديد المنشئ الصحيح الذي يطابق توقيع الطريقة PersonFactory.create. ... يتبع. للأسف لم أجد طريقة لحفظ مسودة المقال، وهذا أمر غريب حقًا، وقد انتهى وقت الترجمة - لذا سأكملها لاحقًا. لكل من يعرف ويفهم اللغة الإنجليزية - المقال الأصلي . إذا كان لديك اقتراحات لتصحيح الترجمة، فاكتب بأي طريقة متاحة لك. حسابي على جيثب
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION