В вашем примере кода вы используете val
list
который не может быть переназначен. Когда вы делаете List.concat(list, obj.anotherObjList)
вы создаете новый список, который concats пустой list
на текущий obj
«s anotherObjList
, но результат никогда не используется, так list
все равно будет пустым после выполнения для-цикла.
Если вам действительно нужно использовать императив для цикла, либо использовать неизменяемое собрание и назначить его на 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
}
}
Но если по какой-то причине вам не нужно использовать императивный цикл, я бы настоятельно рекомендовал использовать функциональную альтернативу:
object MyObj {
var objs = Set(
MyObj("MyObj1", anotherObjList),
MyObj("MyObj1", anotherObjList),
)
def findAll =
objs.flatMap(_.anotherObjList) // if Set as return type is okay
def findAll: List[Int] =
objs.flatMap(_.anotherObjList)(collection.breakOut) // if elements are of type Int and you want to get a List at the end, not a Set
}
это не скомпилируется. 'a' является' List', а не 'MyObj' –
Почему' '' был List? 'objs' - это' Set' 'MyObjs'. –
Я пробовал уменьшить путь, он не работал. Ошибка - несоответствие типа; найдено: List [AnotherObj], требуется MyObj – jerome