【发布时间】:2015-08-10 11:37:29
【问题描述】:
我是 Scala 新手,我正在构建一个 Play 应用程序来学习 Scala 和 Slick。该应用程序有待办事项列表,每个列表都有项目。每个用户都有多个列表。我编写了一个控制器来获取 JSON 格式的列表,并且 JSON 包含列表中的所有项目。
def viewList(id: Long) = AuthenticatedAction.async { implicit request =>
val userId = request.user.toLong;
db.run(todoLists.filter(listById(id, userId)).result.headOption).flatMap { list =>
list match {
case Some(_) => {
val json = toJson(list).as[JsObject]
// Fetch the items in this list and add them to the JSON response
db.run(todoItems.filter(_.listId === id).sortBy(_.text).result).map { items =>
Ok(json + ("items" -> toJson(items)))
}
}
case None => Future.successful(NotFound)
}
}
}
是否可以使用 for 理解来编写此函数?我有一个嵌套的 flatMap+map 调用,所以看起来应该是可能的。
【问题讨论】:
-
每次调用 map、flatMap、filter 都可以重写为理解,但你真的需要吗?这可能更冗长
-
这是一个很好的问题 - 我是 Scala 新手,所以我不太清楚。有人告诉我,理解可以使事情更容易阅读。
-
如果你理解高阶函数的代码,我想你不会。可能只是为了练习或让其他人更好地理解,恕我直言
标签: scala playframework slick playframework-2.4