【Kotlin文法】関数型 ①変数に関数を入れる方法

はじめに
Kotlin で関数を用意するときは fun キーワードを使って、以下のように書きました。
fun playSound() {
// ここに処理を書く
}
Kotlin では変数の値として関数を入れることができるので、fun キーワードを使わずに関数を定義できます。これを「関数型」といいます。
val playSound = {
// ここに処理を書く
}
この書き方は「ラムダ式」とも呼ばれ Kotlin では頻繁に使用します。
この記事では、簡単な例を使って書き方とルールを紹介します。
コードの実行には Kotlin PlayGround を使用しています。
変数に関数を入れる方法
1. 基本的な書き方
Step 1
まずは従来の書き方です。
Hello と表示するだけの sayHello 関数を作成して、main 関数から呼び出してみます。
このコードを Kotlin Playground で実行すると「Hello」と表示されました。

Step 2
次は sayHello 関数を変数に入れてから呼び出します。
2・3行目のようにコードを追加・変更します。
2行目
val helloFunction = ::sayHello
sayHello 関数を変数 helloFunction に入れています。
:: は関数参照演算子というもので、sayHello 関数を参照するためにつけています。
3行目
helloFunction()
変数 helloFunction には関数が入っているので、呼び出すときは () をつける必要があります。
このコードを実行すると、先ほどと同じように Hello と表示されます。

Step 3
次は sayHello 関数を変数にします。
2行目の :: を削除して、6行目を変更します。
2行目
val helloFunction = sayHello
今回は sayHello 関数ではなく、変数 sayHello を参照するので :: は不要になります。
6〜8行目
val sayHello = {
println("Hello")
}
これが最初に紹介した「関数型」という fun キーワードを使わずに関数を定義できる書き方です。
このコードの実行結果も同じように Hello と表示されます。

2. 型と戻り値
変数を用意するときは、変数名の後ろに型を書きました。
val message: String = "こんにちは"
関数にもパラメータ(引数)と戻り値の型を書きましたね。
fun getSize(height: Int, width: Int): Int {
return height*width
}
関数型の場合も、パラメータや戻り値を書くことができます。
val sayHello: (パラメータ) -> 戻り値の型 = {
println("Hello")
}
sayHello 関数
sayHello 関数は「Hello と表示するだけの関数」なのでパラメータも戻り値もありません。
この場合はどちらも省略できるので書いていませんが、省略せずに書くと以下のようになります。
Kotlin では、戻り値がない場合は Unit 型 となります。

パラメータや戻り値がある場合の例も見ていきましょう。
例① パラメータあり+戻り値なし
String 型のパラメータを受け取って表示する関数です。
戻り値がない関数なので Unit 型にしています。
受け取ったパラメータは name という変数で使用できるようにしています。
変数名は自由に変更できて、パラメータが1つの場合は it を使うこともできます(例②で紹介)。
実行結果

例② パラメータあり+戻り値あり
この関数では Int 型のパラメータを受け取って String 型の値を返しています。
パラメータが1つの場合は it で値を使うことができます。
実行結果

例③ パラメータが複数+戻り値あり
この関数では Int 型と Boolean 型のパラメータを受け取って String 型の値を返しています。
今回はパラメータが2つなので coin, isLoggedIn という名前をつけています。
実行結果

注意点
今回書いた関数はすべて最後の行を結果として返すので、値を返すための return キーワードを省略することができました。
しかし最後の行だけを返すので、例③の
"Coin: $coin, Status: $status"
を
"Coin: $coin"
"Status: $status"
と2行に分けて書くと、最後の Status: Offline だけが表示されます。
Coin: 25 という文字列は表示されないので注意しましょう。
