scala:如何将匿名函数转换为 val

scala: How to convert an anonymous function to val

我是一名学习 Scala 并研究匿名函数和值的初学者。 我无法将 {case e if e % 2 == 0 => e} 转换为 Val。我尝试了不同的语法(示例如下)无济于事。转换为 val 没有真正的目的;只是想更深入地了解。

package exercises.functions

object CollectVal extends App {
  println(List(1,2,3,4,5).collect{case e if e % 2 == 0 => e})
  //  val onlyEvens: Int = e:Int => Int = e if (e % 2 == 0 ) =>  e
  //  val onlyEvens = e:Int = {case e if e % 2 == 0 => e}
  println(List(1,2,3,4,5).collect{onlyEvens})
}

感谢任何帮助 谢谢!

你要表达的是一个函数。所以本例中变量的类型是:

val onlyEvens: Int => Int

特别是,collect 接受一个 PartialFunction(即未为某些输入值定义的函数)。所以更正确的写法是:

val onlyEvens: PartialFunction[Int, Int] = { case e if e % 2 == 0 => e }

最后,你可以在collect方法中传递这个val:

List(1,2,3,4,5).collect(onlyEvens)

Scastie

将匿名函数分配给 val 的语法如下(注意 e 周围的括号):

   val x: Int => Int = (e) => if (e % 2 == 0) e else ??? 

或等效的,但更短:val x = (e: Int) => if (e % 2 == 0) e else ???

但您要查找的似乎是部分函数,而不仅仅是一个函数。 PartialFunction 就像一个常规函数,但它只是为其参数的一些可能值定义的。在你的情况下,你希望它只为偶数定义:

    val x = PartialFunction[Int, Int] { case e if e % 2 == 0 => e }

{ case foo => bar } shorthand 适用于部分函数但不适用于常规函数,这就是为什么您在尝试以这种方式定义函数时遇到问题。这将创建一个 PartialFunction,它是为所有匹配 case 子句之一的整数值定义的,而不是为任何其他子句定义的。