groupBy في حقل فئة الحالة ديناميكيًا في سكالا

0

كيف يمكنني تنفيذ عملية groupBy في قائمة فئة الحالة التي تحتوي على فئات الحالة كحقول؟ فمثلا:

case class F1(str1:Option[String],str2:Option[String])
case class F2(int1:Option[Int],int2:Option[Int])

case class Parent(str:F1, int:F2)

لنفترض أن لدي قائمة بفئة الحالة الأصل ويجب علي أداء groupBy في أي مجال من فئات الفئات الفرعية ديناميكيًا.

val data = List(Parent(F1(Some("abc"), Some("pqr"))), F2(Some(20), Some(30)))
                Parent(F1(Some("abc"), Some("xyz"))), F2(Some(20), Some(30)))
                Parent(F1(Some("def"), Some("pqr"))), F2(None, Some(30)))
                Parent(F1(Some("def"), Some("pqr"))), F2(Some(20), Some(30)))
                Parent(F1(None, Some("xyz"))), F2(None, Some(30))))

أريد أن أؤدي data.groupBy("str1") حيث "str1" هو اسم حقل calss F1 وسيتم تمريره ديناميكيًا.

إذا تم تنفيذ هذه العملية بنجاح ، فسيكون الإخراج:

Map(Some("abc") -> List(Parent(F1(Some("abc"), Some("pqr"))), F2(Some(20), Some(30))),
                        Parent(F1(Some("abc"), Some("xyz"))), F2(Some(20), Some(30)))),
    Some("def") -> List(Parent(F1(Some("def"), Some("pqr"))), F2(None, Some(30))),
                        Parent(F1(Some("def"), Some("pqr"))), F2(Some(20), Some(30)))),
    None        -> List(Parent(F1(None, Some("xyz"))), F2(None, Some(30))))) 

1 إجابة

3
افضل جواب

أ List[+A] ، لدى GroupBy توقيع

def groupBy[K](f: (A) ⇒ K): Map[K, List[A]]

لك، A هو Parent ، لذا يمكنك استخدامها

data.groupBy(_.str.str1)

هنا .str خرائط F1 ، ثم .str1 خرائط Option[String] تريد التجميع حسب.

على وجه الخصوص ، نجتاز A => K إلى groupBy ، بدلاً من قيمة. إذا كنت قد حاولت تمرير (شيء مثل) سلسلة بدلا من ذلك على سبيل المثال (_ => "str1") إلى groupBy ، فإنه سيعين كل شيء إلى هذه السلسلة أثناء التجميع ، لذلك سينتهي كل شيء في نفس المجموعة ، وسيكون لديك فقط Map("str1" -> data) .

أما بالنسبة للمرور ديناميكيًا "str1" ، يمكن أن تمر _.str.str1

:مؤلف
فوق
قائمة طعام