我想在结果中使用实际值而不是Option对象。
case class MyObj(id: String, objVal: List[String])
val listOfListOfIds = List(List(id1, id2, id3), List(id4, id5, id6))
val allMyObjs = List(
MyObj("id1",List("val1a", "val1b")),
MyObj("id2",List("val2a", "val2b")),
MyObj("id3",List("val3a", "val3b")),
MyObj("id4",List("val4a", "val4b")),
MyObj("id5",List("val5a", "val5b")),
MyObj("id6",List("val6a", "val6b"))
)
listOfListOfIds.map { _.map { id => allMyObjs.find(obj => obj.id == id).map { _.objVal map { v => Future(v) } } } }
返回List[List[Option[List[scala.concurrent.Future[String]]]]]
,如何获取List[List[List[scala.concurrent.Future[String]]]]
?
答案 0 :(得分:1)
我使用的是flatMap而不是map:
val res = listOfListOfIds.map {
_.flatMap { id => allMyObjs.find(obj => obj.id == id).map { _.objVal map { v => Future(v) } } }
}
答案 1 :(得分:1)
还有另一种解决方案。 Option的来源是您应用于List的find()方法:
allMyObjs.find(obj => obj.id == id)
由于find()可能会或可能不会找到您要查找的内容,因此必须返回一个Option。另一种方法是使用filter(),它将丢弃不符合您作为参数传递的谓词的项,只返回那些。如果您改为使用下面的代码,结果将是一个包含值本身的列表:
> listOfListOfIds.flatMap { _.flatMap { id => allMyObjs.filter(obj => obj.id == id).flatMap {_.objVal map { v => Future (v) } } } }
res0: List[scala.concurrent.Future[String]] = List(Success(val1a), Success(val1b), Success(val2a), Success(val2b), Success(val3a), Success(val3b), Success(val4a), Success(val4b), Success(val5a), Success(val5b), Success(val6a), Success(val6b))
至于删除中间列表,可以使用flatMap()而不是map(),并根据需要结合flatten。
干杯