任何人都可以解释在Scala中如何使用符号“=>”
我在scala中阅读了很多使用符号=>的代码片段,但我从来没有真正理解它.我试图在互联网上搜索,但找不到任何全面的东西.关于符号如何/可以使用的任何指针/解释都将非常有用.
(更具体地说,我也想知道运算符如何在函数文字中出现) 解决方法
不只是传递值/名称,=>用于定义函数文字,函数文字是用于定义函数的替代语法.
示例时间.假设你有一个函数接受另一个函数.收藏品充满了他们,但我们会选择过滤器.过滤器,当在集合(如List)上使用时,将取出导致您提供的函数返回false的任何元素. val people = List("Bill Nye","Mister Rogers","Mohandas Karamchand Gandhi","Jesus","Superman","The newspaper guy") // Let's only grab people who have short names (less than 10 characters) val shortNamedPeople = people.filter(<a function>) 我们可以从其他地方传入一个实际的函数(def isShortName(name:String):Boolean,也许),但将它放在那里会更好.唉,我们可以用函数文字. val shortNamedPeople = people.filter( name => name.length < 10 ) 我们在这里做的是创建一个接受String的函数(因为人类的类型为List [String]),并返回一个布尔值.很酷,对吗? 此语法在许多上下文中使用.假设你想编写一个接受另一个函数的函数.这个其他函数应该接受一个String,并返回一个Int. def myFunction(f: String => Int): Int = { val myString = "Hello!" f(myString) } // And let's use it. First way: def anotherFunction(a: String): Int = { a.length } myFunction(anotherFunction) // Second way: myFunction((a: String) => a.length) 这就是函数文字的含义.回到按名称和按值,有一个技巧,你可以强制参数不被评估,直到你想要.经典的例子: def logger(message: String) = { if(loggingActivated) println(message) } 这看起来没问题,但实际上在调用logger时会评估消息.如果消息需要一段时间来评估怎么办?例如,logger(veryLongProcess()),其中veryLongProcess()返回一个String.哎呦?不是真的.我们可以使用我们关于函数文字的知识来强制在实际需要之前不调用veryLongProcess(). def logger(message: => String) = { if(loggingActivated) println(message) } logger(veryLongProcess()) // Fixed! 记录器现在正在接受一个不带参数的函数(因此左侧是naked =>).您仍然可以像以前一样使用它,但现在,仅在使用消息时(在println中)评估消息. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |