scala在lambda中有一个case语句

时间:2016-06-03 17:01:14

标签: list scala collections

为什么你不能在lambda函数中有一个case语句?我的代码看起来像

def f(list:List[String]):List[Int] = list.map( _ match{ case _.length > 1 => _.length else 1})

input 
"mike" 
"tom"
"t"
" "

output
4  
3
1
1

正如你所看到的,我正在尝试在lambda中做一个案例。我用语法尝试了很多方法。

1 个答案:

答案 0 :(得分:8)

您似乎正在尝试使用保护条款,您可能希望查看a tutorial on match statements

但是,您正在做的事情根本不需要匹配声明。

list.map(x => math.max(1, x.length))

或者,如果max不存在且我们不想两次致电x.length,我们可以指定一个变量:

list.map{ x =>
  val len = x.length
  if (len > 1) len else 1
}

或者,我们可以使用匹配语句,使用保护子句或裸:

list.map(_.length match { case x if x > 1 => x; case _ => 1 })
list.map(_.length match { case x => if (x > 1) x else 1 })

请注意,_ 不是变量。你不能重复使用它。换句话说,它意味着忽略这个","使它成为一个功能","放入下一个变量是"。如果您想要一个可以重复引用的变量,您必须为其命名(例如x)。

另请注意,else "如果不是"替代case语句。如果你想要一个默认的catch-whatever-remain语句(你应该!),请使用case _ =>