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