这是阿列克谢' 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