是否有可能讓List[Option[T]]
的所有條目具有值?從斯卡拉的列表[選項]中獲取所有具有值的條目
實施例:
val list = List(None, Some(1), None, Some(2))
list.filter(_.isDefined).map(_.get)
結果:
List[Int] = List(1, 2)
有做在一個步驟的方法?這是常見的情況,不是嗎?
是否有可能讓List[Option[T]]
的所有條目具有值?從斯卡拉的列表[選項]中獲取所有具有值的條目
實施例:
val list = List(None, Some(1), None, Some(2))
list.filter(_.isDefined).map(_.get)
結果:
List[Int] = List(1, 2)
有做在一個步驟的方法?這是常見的情況,不是嗎?
注意
list.flatten
會做一樣好。
是的,你可以使用collect
爲:
list.collect { case Some(x) => x }
collect
需要PartialFunction[A,B]
這個功能適用於在其上定義,並放棄其餘的所有元素。
編輯:
由於gpampara正確提到的,對於這種情況下flatten
就足夠了。 collect
如果有其他約束和/或轉換,將是正確的工具。
您還可以使用:
list.flatMap(x => x)
scala> val a = List(None, Some(1), None, Some(2))
a: List[Option[Int]] = List(None, Some(1), None, Some(2))
scala> a.flatMap(x => x)
res0: List[Int] = List(1, 2)
有關如何/爲什麼這個工程,你可以看看這篇文章解釋:http://www.brunton-spall.co.uk/post/2011/12/02/map-map-and-flatmap-in-scala/
謝謝。你可以依靠斯卡拉總是有一個更優雅的方式;-) – deamon
一個更優雅的方式很簡單:'list.flatten' – gpampara
@gpampara謝謝,你證明我是正確的:-) – deamon