据我所理解 ._是一个短的lambda,省略a =>
我找到这段代码(可以在这里找到scala-function-true-power)
val file = List("warn 2013 msg", "warn 2012 msg", "error 2013 msg", "warn 2013 msg")
val size = file.filter(_.contains("warn")).filter(_.contains("2013")).size
//val size1 = file.filter(_.contains("warn") && _.contains("2013")).size
val size2 = file.filter( a=> a.contains("warn") && a.contains("2013")).size
println("cat file | grep 'warn' | grep '2013' | wc : " +size )
Run Code Online (Sandbox Code Playgroud)
获取size1的行有语法错误,看起来它无法识别"_",它不是fileList中的元素.
但我使用a =>,正常种类,它运作良好.
那么,为什么scala通过这种方式工作?
在_和a =>中有更多的区别吗?
在scala中,任何_占位符都与调用函数上下文中传递的参数匹配.因此,例如,如果您尝试使用的函数的签名是,f : A ? B并且您正在调用类似的东西collectionOfFunctA.map(_.f)- Scala编译器将推断函数的正确类型,并将使用第一个下划线从集合中放入实际项目并调用函数f超过它.但是如果您将尝试将其写为collectionOfFunctA.map(_.f + _.size)- 那将失败,因为Scala编译器将选择具有已f定义函数的类型的第一个占位符,并且第二个下划线将不匹配上下文中的任何函数.所以它期望有一个函数,它接受两个参数而不是一个.