"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > كيفية حساب الحد الأقصى والحد الأدنى في جافا باستخدام التدفقات؟

كيفية حساب الحد الأقصى والحد الأدنى في جافا باستخدام التدفقات؟

تم النشر بتاريخ 2024-11-18
تصفح:612

¿Cómo calcular el máximo y mínimo en Java usando Streams?

في هذا المنشور سنرى كيفية استخدام Java Streams API لحساب الحد الأقصى والحد الأدنى لمجموعة من العناصر. للقيام بذلك، سنستخدم أساليب max() وmin() لفئة Stream. تتيح لنا هذه الطرق الحصول على الحد الأقصى والحد الأدنى من مجموعة العناصر، على التوالي، باستخدام مقارن مخصص.

لنفترض أن لدينا قائمة من النوع List حيث الامتحان عبارة عن سجل يحتوي على خاصيتين الاسم والدرجة، ونريد الحصول على الامتحان بأعلى درجة وأقل درجة.

public record Exam(String name, Double grade) { }
var exams = Arrays.asList(
        new Exam("Alice", 9.5),
        new Exam("Bob", 6.0),
        new Exam("Charlie", 7.5),
        new Exam("David", 8.0),
        new Exam("Eve", 8.5)
);

في الإصدارات الأخيرة من Java، يمكنك استخدام أساليب max() وmin() لفئة Stream لهذا الغرض عن طريق تمرير مقارنة مخصصة والحصول على اختياري مع النتيجة. في حالة عدم دعم إصدار Java لطريقتي max() وmin()، يمكن استخدام طريقة التجميع() لتمرير Collector كمعلمة، إما Collectors.maxBy() أو Collectors.minBy()، وبالتالي المقارنة الشخصية. إذا كنت تستخدم هذا الخيار الأخير في إصدار حديث من Java، فإن IDE نفسه سيقترح تغييره إلى طريقة max() أو min().

لنبدأ بإنشاء مقارنة مخصصة من النوع Comparator التي تتيح لنا الحصول على الدرجات بترتيب تصاعدي.

Comparator byGradeAsc = (e1, e2) -> (int) (e1.grade() - e2.grade());

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

يمكن تعريف هذه المقارنة بطريقة أخرى باستخدام طريقة المقارنةDouble() لفئة المقارنة والتي تسمح لنا بإنشاء مقارنة من دالة تستخرج قيمة مزدوجة من كائن دون الحاجة إلى كتابة المقارنة يدويًا.

Comparator byGradeAscClean = Comparator.comparingDouble(Exam::grade);

في هذا التعريف يُقال للمقارن أنه يجب أن يأخذ كائنًا من النوع Exam، ويستخرج قيمة خاصية الدرجة ويقارن القيم باستخدام نوع بيانات مزدوج.

هاتان الطريقتان متكافئتان ويمكن استخدامهما بالتبادل، قد يكون فهم الثانية أكثر صعوبة في البداية، ولكن بمجرد فهمها تصبح الكتابة والقراءة أسهل.

الآن بعد أن حصلت على المقارنة، كل ما تبقى هو استخدامها في طريقتي max() وmin() للحصول على الاختبار بأعلى وأدنى درجة، على التوالي.

var highestGrade = exams.stream().max(byGradeAscClean);
var lowestGrade = exams.stream().min(byGradeAscClean);

في هذه الحالة، يتم الحصول على اختياري مع الاختبار الذي حصل على أعلى وأدنى درجة، على التوالي. في حالة كون قائمة الاختبارات فارغة، فسيتم إرجاع الاختياري ()Optional.empty. للحصول على قيمة الاختياري، يمكنك استخدام طريقة ifPresent() التي تستقبل المستهلك وتنفذ التعليمات البرمجية التي تم تمريرها إليه كوسيطة في حالة وجود قيمة.

highestGrade.ifPresent(ex -> System.out.println("Highest grade: "   ex.name()   " "   ex.grade()));
lowestGrade.ifPresent(ex -> System.out.println("Lowest grade: "   ex.name()   " "   ex.grade()));

// Output
Highest grade: Alice 9.5
Lowest grade: Bob 6.0

أو ببساطة قم بتمرير طريقة مرجعية كوسيطة لطباعة قيمة الاختياري، إذا كان الاختياري فارغًا فلن تتم طباعة أي شيء، وإلا ستتم طباعة قيمة الاختياري عن طريق استدعاء طريقة toString () لكائن الاختبار
.

highestGrade.ifPresent(System.out::println);
lowestGrade.ifPresent(System.out::println);

// Output
Exam[name=Alice, grade=9.5]
Exam[name=Bob, grade=6.0]

هنا، بهذه الطريقة يمكنك الحصول على الحد الأقصى والحد الأدنى من مجموعة العناصر باستخدام Java Streams API وواجهة المقارنة.

بيان الافراج تم إعادة نشر هذه المقالة على: https://dev.to/asjordi/como-calcular-el-maximo-y-minimo-en-java-usando-streams-2fca?1 إذا كان هناك أي انتهاك، يرجى الاتصال بـ Study_golang@163 .com لحذفه
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3