gpt4 book ai didi

scala - 在 Scala 中循环并创建列表

转载 作者:行者123 更新时间:2023-12-03 22:30:49 27 4
gpt4 key购买 nike

当我尝试使用 :: 运算符创建列表时,我得到的是空列表。我的代码如下所示:

def getAllInfo(locks: List[String]): List[LockBundle] = DB.withTransaction { implicit s =>
val myList = List[LockBundle]()
locks.foreach(
l => findForLock(l) :: myList
)
myList
}

def findForLock(lock: String): Option[LockBundle] = { ... }

有什么建议吗?

最佳答案

使用flatMap

locks.flatMap(l => findForLock(l))

你的代码变成了

def getAllInfo(locks: List[String]): List[LockBundle] = DB.withTransaction { implicit s =>
locks.flatMap(l => findForLock(l))
}

或者,您可以使用 mapflatten。像这样的东西 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] 类型,所以将列表类型更改为列表[选项[LockBundle]]

为了从 List[Option[LockBundle]] 获取 List[LockBundle] 只需在 List[Option 上执行 flatten [LockBundle]] 列表。看下面的代码片段

  var myList = List[Option[LockBundle]]()
locks.foreach(
l => myList = findForLock(l) :: myList
)
myList.flatten

以上方式无效,不推荐。

关于scala - 在 Scala 中循环并创建列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41283112/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com