使用Map创建此代码并设置更多Scala-ish

时间:2014-06-11 19:58:14

标签: scala

如何使这些代码行更加scala-ish(更短?)。我仍然感受到Java的感觉(我想远离它)。提前谢谢!

import scala.collection.mutable
val outstandingUserIds: mutable.LinkedHashSet[String] = mutable.LinkedHashSet[String]()    

val tweetJson = JacksMapper.readValue[Map[String, AnyRef]](body)     
val userObj = tweetJson.get("user")    
tweetJson.get("user").foreach(userObj => {
  userObj.asInstanceOf[Map[String, AnyRef]].get("id_str").foreach(idStrObj => {
    if (outstandingUserIds.exists(outstandingIdStr => outstandingIdStr.equals(idStrObj))) {
      outstandingUserIds.remove(idStrObj.asInstanceOf[String])
    }
  })
})

1 个答案:

答案 0 :(得分:1)

您希望在Scala中做的一件事是利用类型推断。这样,你就不需要在LHS上重复自己了:

val outstandingUserIds = mutable.LinkedHashSet[String]()

在闭包变量userObj =>之后,你也不需要内括号。相反,在foreach {}之后使用大括号来执行多个语句:

tweetJson.get("user").foreach { userObj =>

}

事实上,你可以使用匿名变量' _'并说:

tweetJson.get("user").foreach {
   _.get("id_str").foreach ...
}

Scala鼓励使用不可变集合。进一步简化上述内容的一种方法是使用collect(而不是exists + delete),这将返回仅包含所需元素的新集合。