最初に関数の例 (実際にはメソッド):
import java.io.File
def fileExists(file: File) = file.exists
そして、その関数(実際にはメソッド)を引数として別の関数(実際には...あなたが知っている...)に渡す方法:
def findFiles(files: Seq[File], predicate: (File) => Boolean) =
files filter predicate
このメソッドは、ファイルのシーケンスを受け入れ、そのシーケンスをフィルタリングして、指定された述語を通過するファイルのみを選択します。この場合、既存のファイルのみを返します。
findFiles(Seq(new File("a.txt"), new File("b.txt")), fileExists)
exists
メソッドを引数として渡す方法がいかに洗練されているかがわかりますか? または、述語を手動で呼び出したい場合:
def fileMatches(file: File, predicate: (File) => Boolean) =
predicate(file)
補足: " ...実際にはメソッド"
このfindFiles()
メソッドはpredicate
関数を引数として取ります。ただし、これfileExists()
はメソッドです。これは、 eta-expansionと呼ばれるメカニズムによって機能します。つまり、メソッドを透過的に関数にラップします。