如何使用模式匹配在scala中获取一个nonEmpty列表?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用模式匹配在scala中获取一个nonEmpty列表?相关的知识,希望对你有一定的参考价值。
我使用case x :: Nil => ...
尝试确保列表是非空的,但它只匹配单个元素列表。如何使用模式匹配获取非空列表?
更新 对不起,看来我输了一些东西,有一个特殊的场景使用了比赛内线,
object AccountResult{
def unapply(account: AccountResult): Option[(String, List[String])] = ???
}
//ignore accountResult define please
accountResult match {
case AccountResult(_, x :: _) => ...
}
如何匹配accountResult哪个List [String](x :: _)值不是Nil?然后获取匹配的List [String]值
答案
而不是仅使用Nil
指定空列表,指定可以是任何列表的内容,例如:
case x :: tail => ... // tail is a local variable just like x, holding the tail of the list
或者干脆:
case x :: _ => ...
如果你不关心或不会使用尾巴。
这些模式将匹配具有至少一个元素的任何列表(而不是根据现有模式恰好一个元素)。同样,模式:
case x :: y :: the_rest => ...
将匹配任何列表至少有两个元素。
编辑(回复您的评论):
您可以使用“@
”分配案例模式中的变量。因此,对于您可能已经看过的(典型用法)示例:
case acc@AccountResult(_, x :: tail) => ... // do something with 'acc'
或者,根据您的评论匹配您正在寻找的用法:
case AccountResult(_, phone@(x :: tail)) => ... // do something with 'phone'
另一答案
要检查列表是否为空,您可以通过以下方式匹配模式:
list match {
case Nil => false
case _ => true
}
要么
list match {
case Nil => false
case x::xs => true
}
另一答案
如果您只想将整个非空列表分配给val,而不分割头部和尾部,则只需添加一个匹配空列表的大小写,另一个将列表分配给变量名称,如下所示:
accountResult match {
case List() => ??? // empty case
case myAccountResult => ??? //myAccountResult will contain the whole non-empty list
}
Nil
也做了这个工作,匹配一个空列表
accountResult match {
case Nil => ??? // empty case
case myAccountResult => ??? //myAccountResult will contain the whole non-empty list
}
另一答案
如果这是您经常使用的东西,您可以创建这样的自定义匹配器:
object NonEmpty {
def unapply(l: List[_]) = l.headOption.map(_ => l)
}
这可以这样使用:
scala> List() match { case NonEmpty(l) => println(l) }
scala.MatchError: List() (of class scala.collection.immutable.Nil$)
... 33 elided
scala> List(43) match { case NonEmpty(l) => println(l) }
List(43)
scala> List(43, 32) match { case NonEmpty(l) => println(l) }
List(43, 32)
以上是关于如何使用模式匹配在scala中获取一个nonEmpty列表?的主要内容,如果未能解决你的问题,请参考以下文章