scala中案例类字段上的groupBy动态
如何对以案例类作为字段的案例类列表执行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
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)。还有其他方法吗?反射应该能够做到这一点,但我自己从来没有用过,如果只有四种情况,我会选择模式匹配之类的方法