scala中案例类字段上的groupBy动态

scala中案例类字段上的groupBy动态,scala,dynamic,grouping,case-class,Scala,Dynamic,Grouping,Case Class,如何对以案例类作为字段的案例类列表执行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

如何对以案例类作为字段的案例类列表执行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”是case cals 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))))) 

对于
列表[+a]
,groupBy具有签名

def groupBy[K](f: (A) ⇒ K): Map[K, List[A]]
对于您来说,
A
是一个
父级
,因此您可以使用

data.groupBy(_.str.str1)
这里
.str
映射到
F1
,然后
.str1
映射到要按其分组的
选项[String]

特别是,我们将一个
A=>K
传递给groupBy,而不是一个值。如果您尝试将字符串(类似)传递给groupBy,例如
(\u=>“str1”)
,则在分组时,它会将所有内容映射到该字符串,因此所有内容都将在同一个组中结束,而您只需拥有
映射(“str1”->数据)


对于动态传递
“str1”
,您可以传递
。.str.str1

对于
列表[+a]
,groupBy具有签名

def groupBy[K](f: (A) ⇒ K): Map[K, List[A]]
对于您来说,
A
是一个
父级
,因此您可以使用

data.groupBy(_.str.str1)
这里
.str
映射到
F1
,然后
.str1
映射到要按其分组的
选项[String]

特别是,我们将一个
A=>K
传递给groupBy,而不是一个值。如果您尝试将字符串(类似)传递给groupBy,例如
(\u=>“str1”)
,则在分组时,它会将所有内容映射到该字符串,因此所有内容都将在同一个组中结束,而您只需拥有
映射(“str1”->数据)


至于动态传递
“str1”
,您可以传递
。.str.str1

,谢谢您的回答。我想进一步说明情况。groupBy可以在任何字段(str1、str2、int1或int2)上执行,而该字段在编译时是未知的,代码将仅在运行时具有该信息。我可以通过使用模式匹配想到一种方法,例如:case“str1”=>data.groupBy(uu.str.str1);大小写“str2”=>data.groupBy(u.str.str2)。还有其他的方法吗?反射应该能够做到这一点,但我自己从来没有用过,如果只有四种情况,我会用模式匹配之类的方法来回答。我想进一步说明情况。groupBy可以在任何字段(str1、str2、int1或int2)上执行,而该字段在编译时是未知的,代码将仅在运行时具有该信息。我可以通过使用模式匹配想到一种方法,例如:case“str1”=>data.groupBy(uu.str.str1);大小写“str2”=>data.groupBy(u.str.str2)。还有其他方法吗?反射应该能够做到这一点,但我自己从来没有用过,如果只有四种情况,我会选择模式匹配之类的方法