【发布时间】:2020-09-01 16:42:16
【问题描述】:
我有一个包含数据的源列表,我想将其排序为 3 个包含已清理数据、更新数据并记录的列表。源中的所有元素都必须在记录列表中。所有具有非空值的元素都必须在清理列表中,如果更新了标志,该元素也必须出现在更新的文件夹中。
根据例子:
- 更新 = 2,4 el
- 记录 = 1,2,3,4 el
- 清洁 = 3, 4 el
你能帮我简化写好的代码吗:
case class Source(value: Option[String], date: String, isUpdate: Boolean)
case class Cleaned(value: String, date: String)
case class Logged(value: String, date: String)
case class Updated(value: String, date: String)
val sources: List[Source] = List(
Source(Option.empty[String], "2020-01-09", false), // 1
Source(Option.empty[String], "2020-01-09", true), // 2
Source(Option("Some Data"), "2020-01-09", false), // 3
Source(Option("Some Data 2"), "2020-01-09", true) // 4
)
val target = sources.foldLeft(List.empty[Updated], List.empty[Logged], List.empty[Cleaned]){
case ((updated, logged, cleaned), el) if el.isUpdate =>
(updated :+ Updated(el.value.getOrElse(""), el.date),
logged :+ Logged(el.value.getOrElse(""), el.date),
el.value.fold(cleaned)(d => cleaned :+ Cleaned(d, el.date))
)
case ((updated, logged, cleaned), el) =>
(updated,
logged :+ Logged(el.value.getOrElse(""), el.date),
el.value.fold(cleaned)(d => cleaned :+ Cleaned(d, el.date))
)
}
【问题讨论】:
-
你确定
updated应该包含第二个元素吗?我阅读要求的方式是该值应该存在并且标志为true。