【发布时间】:2012-05-30 15:03:35
【问题描述】:
我正在研究一种方法,该方法对多个项目有 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)
)
}
使用可变数据结构的问题不是很“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)
)
}
【问题讨论】:
-
查看这个 Gist,它解释了使用应用函子进行非快速验证,由 ScalaZ 提供:gist.github.com/970717
标签: scala collections iteration