العثور على كائن ذي أقل قيمة وإرجاع الكائن، وليس القيمة، باستخدام الدفق

StackOverflow https://stackoverflow.com//questions/23016965

  •  21-12-2019
  •  | 
  •  

سؤال

أجد حاليًا الكائن ذو القيمة الأقل مثل هذا:

List<Location> locations = new ArrayList<Location>();
RGB colour = new RGB(5,3,7);
Location best = null;
double bestscore = 0.0;
for(Location loc : locations)
{
  if(best == null)
  {
    best = loc;
    bestscore = getScore(loc,colour, average);
  }
  else
  {
    double oscore = getScore(loc,colour, average);
    if(oscore < bestscore)
    {
      best = loc;
      bestscore = oscore;
    }
  }
}

حيث getScore هو:

double getScore(Location loc, RGB colour, boolean average)

يعد هذا بطيئًا جدًا نظرًا لأن المواقع عادةً ما تحتوي على بضعة آلاف من الإدخالات ويتم استخدام هذه الحلقة بضعة ملايين من المرات على التوالي.

لذلك أردت أن أحاول استخدام موازي Stream() الجديد من Java 8.لقد قمت بعمل مقارنة تقارن قيم getScore.

Location best = locations.parallelStream().min(new ComparatorScoreDif(colour)).get();

هل أنا أسير في الاتجاه الصحيح هنا، هل هذه هي الطريقة الصحيحة للقيام بذلك؟

هل كانت مفيدة؟

المحلول

giveacodicetagpre.

سيعود الكائن الفعلي من الكائن الاختياري.انها موجودة.يمكنك استدعاء GransodicetagCode على الكائن الاختياري مسبقا للتحقق من ذلك.

هل أذهب في الاتجاه الصحيح هنا، هل هذه هي الطريقة الصحيحة للقيام بذلك؟

نعم هو.عن طريق استدعاء .isPresent()، تسلم جزء التزامن إلى JVM (، وسوف تقسم الدفق في مجموعات فرعية متعددة ) ويمكنك التركيز على المنطق الفعلي الذي يجب تنفيذه بالتوازي.

انظر oracledocs - التوازي للحصول على مزيد من المعلومات وبعضها لطيفتفسير.

نصائح أخرى

نعم باستخدام min() مع Comparator هو النهج الصحيح للقيام بذلك.ومع ذلك، لا تحتاج إلى إنشاء تطبيق المقارنة الخاص بك ComparatorScoreDif.بدلا من ذلك، يمكنك استخدام Comparator.comparing وظيفة المجمعة لتوليد Comparator, ، نظرا لوظيفة تشتق القيم المراد مقارنتها.

تستخدم معظم الأمثلة مراجع الطريقة للأحرف الموجودة على الكائن الذي تتم مقارنته.لو Location كان لديه getScore الطريقة، يمكن للمرء أن يفعل هذا:

Location best = locations.parallelStream()
                         .min(Comparator.comparing(Location::getScore))
                         .get();

لكن، getScore ليست طريقة على Location, ، ويتطلب الأمر بعض المعلمات الإضافية.سيتطلب ذلك كتابة تعبير لامدا "بخط اليد" بدلاً من استخدام مرجع الطريقة.يمكن الحصول على القيم الإضافية من البيئة:

Location best = locations.parallelStream()
                         .min(Comparator.comparingDouble(loc -> getScore(loc, colour, average)))
                         .get();

هذا يتجنب الحاجة إلى كتابة فصل دراسي للتنفيذ Comparator.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top