あなたのコード例では、val
list
を使用しています再割り当てすることはできません。あなたがList.concat(list, obj.anotherObjList)
を行うと、あなたは現在のobj
のanotherObjList
に空list
をconcats新しいリストを作成しているが、結果が使用されることはありませんので、list
はまだforループの実行後に空になります。
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
}
}
:
あなたが本当にforループ不可欠を使用し、いずれかの不変なコレクションを使用して、forループの体から再割り当てすることができvar
に割り当てるか、変更可能なコレクションを使用する必要がある場合
しかし、何らかの理由で強制的なループを使用する必要がない場合は、機能的な代替手段を使用することを強くお勧めします。
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'は' MyObj'ではなく 'List'です –
' a'がなぜリストになるのですか? 'objs'は' MyObjs'の 'Set'です。 –
私は減らす方法を試していましたが、うまく機能しませんでした。エラーは型の不一致です。 found:List [AnotherObj]、MyObjが必要です – jerome