J P*_*lar 3 scala list coalesce extending
我试图创建一个新的运算符:?在列表上,其操作与::相同,但如果值为null,则返回原始列表.我写了以下内容,但很快就知道我不知道自己在做什么......
object ImplicitList {
implicit def extendIterator[T](i : List[T]) = new ListExtension(i)
}
class ListExtension[T <: Any](i : List[T]) {
def :?[B >: T] (x: B): List[B] = if (x != null) x :: i else i
}
final case class :?[B](private val hd: B, private val tl: ListExtension[B]) extends ListExtension[B](tl.:?(hd))
Run Code Online (Sandbox Code Playgroud)
dhg*_*dhg 13
你想要的是增强我的库模式.有了这个,你可以添加一个新的方法List.这是看起来如何:
class EnhancedList[T](self: List[T]) {
def ?:(t: T) =
t match {
case null => self
case _ => t :: self
}
}
implicit def enhanceList[T](self: List[T]) = new EnhancedList(self)
Run Code Online (Sandbox Code Playgroud)
因此,有一类EnhancedList是包装List的新方法,其中?:被定义,并且转换的隐函数List来EnhancedList时?:被调用.请注意,您必须使用?:而不是:?因为Scala的规则使得运算符是正确关联的,当且仅当它以a结尾时才是:.
以下是它的使用方法:
scala> val l = List("a","b","c")
l: List[java.lang.String] = List(a, b, c)
scala> null ?: l
res136: List[java.lang.String] = List(a, b, c)
scala> "d" ?: l
res137: List[java.lang.String] = List(d, a, b, c)
Run Code Online (Sandbox Code Playgroud)