使用flatMap
locks.flatMap(l => findForLock(l))
你的代码变成了
def getAllInfo(locks: List[String]): List[LockBundle] = DB.withTransaction { implicit s =>
locks.flatMap(l => findForLock(l))
}
您也可以使用map 和flatten。像这样locks.map(l => findForLock(l)).flatten
函数式编程是关于转换的。您只需使用您的函数findForLock 的转换将现有列表转换为另一个列表。
您的代码有问题
val myList = List[LockBundle]()
locks.foreach(
l => findForLock(l) :: myList
)
myList
首先foreach 返回Unit 因此,您使用 foreach 进行副作用操作而不是转换。因为你需要转换所以不要使用foreach。
接下来,findForLock(l) :: myList 会为您提供一个值,但这会被忽略,因为没有人存储生成的值。因此,为了存储值,请使用累加器并将其作为函数参数传递,以防递归。
更正您的代码
如果您想按照自己的方式行事。您需要使用累加器。
首先修复你的类型findForLock(l)返回Option,你的列表是List[LockBundle]类型,所以将列表类型更改为List[Option[LockBundle]]。
为了从List[Option[LockBundle]] 获得List[LockBundle],只需在List[Option[LockBundle]] 列表中执行flatten。见下面代码sn-p
var myList = List[Option[LockBundle]]()
locks.foreach(
l => myList = findForLock(l) :: myList
)
myList.flatten
以上方式无效,不推荐使用。