假设我想做类似下面的事情,我在其中操作一个 Scala 列表,然后执行匹配以转换为一个选项。有没有一种方法可以在不添加括号的情况下继续链(对于更复杂的示例,嵌套括号可能看起来很困惑)?
def foo: Option[Int] = {
MyUtils.myListOfFoo
.flatMap(_.barList)
.filter(_.isGood)
.toList match {
case List(bar) => Some(addr)
case _ => None
}
.map(_.getBaz) // would like to do something like this w/o adding parens
.map(_.numBlah)
}
最佳答案
你可以用 pimp my library 模式模拟它:
object MyUtils {
implicit class ListOpts[A](val l: List[A]) extends AnyVal {
def myMatch[B](pf: PartialFunction[List[A], Option[B]]): Option[B] =
pf.applyOrElse(l, (_: List[A]) => None)
}
...
}
然后在范围内导入它
import MyUtils._
最后,您的无括号管道是
def foo: Option[Int] = {
myListOfFoo // imported
.flatMap(_.barList)
.filter(_.isGood)
.toList // Not needed as filter already returns a List
.myMatch { // resolved implicitly
case List(bar) => Some(addr)
case _ => None // Not needed as it's handled by myMatch
}
.map(_.getBaz) // would like to do something like this w/o adding parens. Now you can :-)
.map(_.numBlah)
}
关于scala - 将模式匹配混合到一系列映射和过滤器中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24130640/