groupBy на поле класса дела динамически в Scala

Как я могу выполнить операцию 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" - это имя поля регистра регистра 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 ответ

Для 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

Другие вопросы по тегам