我想知道如何使用循环连接多个列表。以下是我尝试做的一个例子:
object MyObj {
var objs = Set (
MyObj("MyObj1", anotherObjList),
MyObj("MyObj2", anotherObjList)
)
val list = List.empty[AnotherObj]
def findAll = for (obj <- objs) List.concat(list, obj.anotherObjList)
}
我希望函数findAll能够连接set objs对象的列表。
答案 0 :(得分:5)
试试这个:
objs.flatMap(_.anotherObjList)
它不使用for
,但这可能是Scala中最简洁易读的方式。
答案 1 :(得分:1)
使用reduce
这样的事情:
objs.reduce((a,b) => a.anotherObjList ++ b.anotherObjList)
如果Set
可以为空,请使用foldLeft
:
objs.foldLeft(List.empty[AnotherObj],(a,b) => a.anotherObjList ++ b.anotherObjList)
答案 2 :(得分:1)
在您的代码示例中,您使用的val
list
无法重新分配。当您执行List.concat(list, obj.anotherObjList)
时,您正在创建一个新列表,将空list
连接到当前obj
的{{1}},但结果是从未使用过,因此在执行for循环后anotherObjList
仍然为空。
如果你真的需要使用命令式for循环,要么使用不可变集合并将其分配给list
,可以从for-loop的主体重新分配或使用可变集合:
var
但是如果您由于某种原因不必使用命令式循环,我强烈建议使用功能替代方案:
object MyObj {
var objs = Set(
MyObj("MyObj1", anotherObjList),
MyObj("MyObj1", anotherObjList),
)
def findAllLoop1 = {
var list = List.empty
for (obj <- objs) list = list ++ obj.anotherObjList
list
}
def findAllLoop2 = {
val buf = collection.mutable.ListBuffer[Int]() // replace Int with your actual type of elements
for (obj <- objs) buf ++= obj.anotherObjList
}
}