私は次のようなケースクラスを持っています:
case class ReportData(
building: Option[String] = None,
serial: Option[String] = None,
`type`: Option[String] = None,
model: Option[String] = None,
machine: Option[String] = None)
そして他の分野も。
たとえば、これらのオブジェクトのリストがあります。
val reports = List(report1, report2, report3, report11, report12)
リクエストは、これらのクラスの特定のフィールドを使用して特定の複雑な操作を実行することです。たとえば、これらのリストをパラメーターとして受け取ったフィールドのみでグループ化します。groupFields="building,serial"
これは細かいグループ化の例です:
val reportsGroupBoth = reports.groupBy(p => (p.building.getOrElse(""), p.serial.getOrElse("")))
しかし、受け取ったフィールドに応じて条件付きにしたいので、私が考えている唯一の方法は、フィールドごとに区切られたグループを作成することです(後で追加します。それらを区切ればif condition
、上記と同じ結果を受け取りたいだけです。group by
結果のタイプ:Map[(String, String),List[agile.ReportData]]
だから私は試しました:
// group by building (if building is defined in groupFields list)
val reportsGroup1 = reports.groupBy(p => p.building)
これは問題ありませんが、これは間違っています:
// group by building and serial (if building and serial are in groupFields list)
val reportsGroup2 = reportsGroup1 map {
case (key, value) => (key, value.groupBy(v => v.serial).keys) -> value.groupBy(v => v.serial).values
}
したがって、問題は、最終的 にtpyereportsGroup2
と同じ結果になるように変更する方法ですreportsGroupBoth
Map[(String, String),List[agile.ReportData]]