Sử dụng Scala 2.7.7:Làm thế nào để làm phẳng danh sách các tùy chọn sử dụng các hàm bậc cao hơn?
Nếu tôi có một danh sách các tùy chọn, tôi có thể san bằng chúng bằng cho-hiểu:
val listOfOptions = List(None, Some("hi"), None)
listOfOptions: List[Option[java.lang.String]] = List(None, Some(hi), None)
scala> for (opt <- listOfOptions; string <- opt) yield string
res0: List[java.lang.String] = List(hi)
tôi không thích phong cách này, và thà sử dụng một HOF. Nỗ lực này là quá dài dòng để được chấp nhận:
scala> listOfOptions.flatMap(opt => if (opt.isDefined) Some(opt.get) else None)
res1: List[java.lang.String] = List(hi)
trực giác tôi dự kiến sẽ có sau đây để làm việc, nhưng nó không:
scala> List.flatten(listOfOptions)
<console>:6: error: type mismatch;
found : List[Option[java.lang.String]]
required: List[List[?]]
List.flatten(listOfOptions)
Ngay cả sau có vẻ như nó nên làm việc, nhưng doesn 't:
scala> listOfOptions.flatMap(_: Option[String])
<console>:6: error: type mismatch;
found : Option[String]
required: (Option[java.lang.String]) => Iterable[?]
listOfOptions.flatMap(_: Option[String])
^
Điều tốt nhất tôi có thể đưa ra là:
scala> listOfOptions.flatMap(_.toList)
res2: List[java.lang.String] = List(hi)
... nhưng tôi sẽ không muốn chuyển đổi tùy chọn thành danh sách. Điều đó có vẻ hơi vụng về.
Bạn có lời khuyên nào không?
Ồ vâng. Cảm ơn bạn! Tôi đã từng vấp ngã khi flatMap (o => o) nhưng nhanh chóng quên nó đi. Tại sao flatMap (_) không hoạt động như nhau cũng là một điều tò mò. – Synesso