這是阿列克謝' s解決方案 - 應用pimp-my-library模式。
通過輕微濫用CanBuildFrom
含義,可以編寫適用於包裝集合類型的選項的通用擴展方法orEmpty
。
基本上需要的是一種抓住某個包裝類型的空實例的方法。這也可以在scalaz中使用Monoid.empty
來完成。 CanBuildFrom
解決方案的優點是不依賴於外部依賴性。
implicit class RichOpt[A](opt: Option[A]) {
import collection.generic.CanBuildFrom
def orEmpty[To >: A](implicit cbf: CanBuildFrom[A,_,To]): To =
opt.getOrElse(cbf().result())
}
//--------- Examples --------------
println("some seq: " + (None: Option[Seq[Int]]).orEmpty)
//>some seq: List()
println("none seq: " + (Some(Seq(1,2,3))).orEmpty)
//>none seq: List(1, 2, 3)
println("some range: " + (Some(1 to 3)).orEmpty)
//>some range: Range(1, 2, 3)
println("none range: " + (None: Option[Range]).orEmpty)
//>none range: Vector()
println("some string: " + Some("abc").orEmpty)
//>some string: abc
println("none string: " + (None: Option[String]).orEmpty)
//>none string:
你想達到什麼目的?這個代碼可以用'val some =「string」更清晰; val none =「」;':-) – 2015-03-25 09:23:02
這只是我遇到工作的一個例子,它不是一個真實的生活邏輯例子哈哈! :) – Davey 2015-03-25 09:24:17
任何人都可以回答你的問題,如果他看不到代碼,代碼可以改進,所以不明白你需要改進什麼,使得更清潔? – 2015-03-25 09:27:38