Mic*_*len 1 iteration collections scala
我正在研究一种方法,它对多个项目有3种可能的结果:错误,无效和成功.对于其中的每一个,我需要返回一个json列表,标识哪些项目出错,无效且成功.
我目前的尝试如下.我已经习惯Object了代表我的对象,因为完全解释会花费太长时间.的Object类有一个方法process,当对象是无效的,它返回一个布尔值,以指示成功或错误并抛出异常:
def process(list: List[Objects]) = {
val successIds = new ListBuffer[Int]();
val errorIds = new ListBuffer[Int]();
val invalidIds = new ListBuffer[Int]();
list.foreach( item => {
try {
if (item.process) {
successIds ++ item.id
} else {
errorIds ++ item.id
}
} catch {
case e: Exception => invalidIds ++ item.id
}
})
JsonResult(
Map("success" -> successIds,
"failed" -> errorIds,
"invalid" -> invalidIds)
)
}
Run Code Online (Sandbox Code Playgroud)
问题是使用Mutable数据结构不是很"Scala-y".我更喜欢以更实用的方式构建这些列表,但我对scala很新.关于如何做到这一点的任何想法或提示?
我使用像flatMap方法这样的东西,它采用一组集合并以与flatMap方法对单个集合相同的方式对它们进行整理:
def process(list: List[Objects]) = {
val (success, error, invalid) = list.flatMap( item => {
try {
if (item.process) {
(List(item.id), List.empty, List.empty)
} else {
(List.empty, List(item.id), List.empty)
}
} catch {
case e: Exception =>
(List.empty, List.empty, List(item.id))
}
})
JsonResult(
Map("success" -> success,
"failed" -> error,
"invalid" -> invalid)
)
}
Run Code Online (Sandbox Code Playgroud)
flatMap这不是你需要的 - 你需要groupBy:
def process(list: List[Objects]) = {
def result(x: Objects) =
try if (x.process) "success" else "failed"
catch {case _ => "invalid"}
JsonResult(list groupBy result mapValues (_ map (_.id)))
}
Run Code Online (Sandbox Code Playgroud)