连接多个列表

时间:2016-03-31 13:03:05

标签: scala collections

我想知道如何使用循环连接多个列表。以下是我尝试做的一个例子:

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对象的列表。

3 个答案:

答案 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
  }
}