使用flatMap
locks.flatMap(l => findForLock(l))
あなたのコードは
def getAllInfo(locks: List[String]): List[LockBundle] = DB.withTransaction { implicit s =>
locks.flatMap(l => findForLock(l))
}
また、あなたがmap
とflatten
を使用することができなりました。このようなものlocks.map(l => findForLock(l)).flatten
機能プログラミングはすべて変換に関するものです。あなたの関数findForLock
である変換を使用して、既存のリストを別のリストに変換するだけで済みます。ので、あなたのコードのすべてのforeach
リターンUnit
の
val myList = List[LockBundle]()
locks.foreach(
l => findForLock(l) :: myList
)
myList
まず付き
問題は、あなたが側には、変換操作を行うとないためのforeachを使用しています。変換が必要なので、foreach
を使用しないでください。
次に、findForLock(l) :: myList
に値が与えられますが、生成された値を格納している人がいないため無視されます。したがって、値を格納するためにaccumulatorを使用し、再帰の場合には関数のパラメータとして渡します。
あなたはあなたの方法で行いたい場合は、あなたのコード
修正。アキュムレータを使用する必要があります。
最初にあなたのタイプを修正してくださいfindForLock(l)
はOption
を返します。リストのタイプはList[LockBundle]
ですので、リストタイプをList[Option[LockBundle]]
に変更してください。
List[LockBundle]
をList[Option[LockBundle]]
から得るにはflatten
をList[Option[LockBundle]]
にしてください。下記のコードスニペットを参照してください
var myList = List[Option[LockBundle]]()
locks.foreach(
l => myList = findForLock(l) :: myList
)
myList.flatten
上記の方法は機能しないため、お勧めしません。
http://www.flatmapthatshit.com/ –