(あなたが別の(言い換えた)質問を投稿したのを見ませんでした。これがあなたの最初の質問に答えたものです)
値/名前を渡すだけでなく=>
、関数リテラルを定義するために使用されます。これは、関数を定義するために使用される代替構文です。
時間の例。別の関数を取り込む関数があるとしましょう。コレクションはそれらでいっぱいですが、私たちは選びfilter
ます。filter
、コレクション(リストなど)で使用すると、指定した関数が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 )
ここで行ったことは、文字列(people
型であるためList[String]
)を受け取り、ブール値を返す関数を作成することです。かなりかっこいいですよね?
この構文は、多くのコンテキストで使用されます。別の関数を取り込む関数を作成するとします。この他の関数は文字列を受け取り、別の文字列を返す必要があります。
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)
それが関数リテラルです。に戻ってby-name
、by-value
必要になるまでパラメータを強制的に評価しないようにするトリックがあります。古典的な例:
def logger(message: String) = {
if(loggingActivated) println(message)
}
これは問題ないように見えますが、が呼び出さmessage
れたときに実際に評価されます。評価に時間がかかるlogger
場合はどうなりますか?message
たとえばlogger(veryLongProcess())
、ここで、veryLongProcess()
は文字列を返します。おっと?あまり。関数リテラルに関する知識を使用して、veryLongProcess()
実際に必要になるまで呼び出されないようにすることができます。
def logger(message: => String) = {
if(loggingActivated) println(message)
}
logger(veryLongProcess()) // Fixed!
logger
現在、パラメータをとらない関数を取り入れています(したがって、=>
左側が裸になっています)。以前と同じように使用できますが、現在message
は(で)使用された場合にのみ評価されprintln
ます。