从flatMap返回多个集合

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)

Lui*_*hys 8

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)