scala:将match语句转换为模式匹配匿名函数 - 使用值

时间:2015-03-29 18:04:06

标签: scala pattern-matching

类似的问题:Convert match statement to partial function when foreach is used。现在同样,IntelliJ要求我改进我的代码。不同之处在于,我使用匹配值:

val matchMe = "Foo"
keys.foreach(key =>
  key match {
    case `matchMe` => somethingSpecial()
    case _ => somethingNormal(key, calcWith(key))
  })

将此重构为匿名模式匹配函数将类似于:

keys.foreach {
  case `matchMe` => somethingSpecial(_)
  case _ => somethingNormal(_, calcWith(_)) //this doesn't work
}

请注意,在第二种情况下,我不能使用_因为我需要它两次。有没有办法在这里使用匿名模式匹配函数?

1 个答案:

答案 0 :(得分:27)

您不能在此处使用通配符_,其目的是表明您不关心与之匹配的值。

您可以使用命名参数:

keys.foreach {
  case `matchMe` => somethingSpecial(matchMe)
  case nonSpecialKey => somethingNormal(nonSpecialKey, calcWith(nonSpecialKey))
}

没有任何限制,它将匹配任何值。请注意case s的顺序很重要,因为case x => ...与任何内容匹配,并且基本上会快捷其他case语句。


顺便说一句,我不认为你的somethingSpecial(_)做了你想要/期望的事。它只是x => somethingSpecial(x)的简短版本,而不是somethingSpecial(matchMe)