Kotlinの関数リテラル(匿名関数)の作り方と使い方をやさしく解説!初心者向け関数型プログラミング入門
生徒
「Kotlinで関数を作るときに、名前をつけない書き方があるって聞いたんですが…それってどういうものなんですか?」
先生
「それは『関数リテラル』とか『匿名関数』と呼ばれる書き方ですね。関数に名前をつけずに、必要なときだけその場で書く方法です。」
生徒
「関数に名前をつけないって、どういう場面で使うんですか?普通の関数と何が違うんでしょうか?」
先生
「とても良い疑問です。ではこれから、Kotlinで関数リテラル(匿名関数)を作る方法と、その使い方を一つずつ見ていきましょう!」
1. 関数リテラル(匿名関数)とは?
Kotlinの「関数リテラル」は、関数に名前をつけずに定義する方法です。「匿名関数」とも呼ばれます。通常の関数はfunを使って名前をつけますが、関数リテラルはその場だけで使う一時的な関数です。
たとえば次のように書きます。
val greet = fun(name: String): String {
return "こんにちは、$name さん"
}
println(greet("田中"))
funのあとに名前を書かないで、直接(引数): 戻り値の型と書いているのが特徴です。
2. ラムダ式との違いは?
Kotlinでは関数リテラルとよく似た書き方として「ラムダ式」があります。どちらも名前のない関数ですが、書き方と使い道に違いがあります。
val greetLambda = { name: String -> "こんにちは、$name さん" }
ラムダ式は、{ 引数 -> 処理 }という形で、とても短く書けます。一方、匿名関数はreturnが使えたり、複雑な処理に向いています。
3. 匿名関数を使う場面とは?
関数リテラル(匿名関数)は、以下のような場面で使うと便利です。
- 関数の中でちょっとだけ一時的な処理をしたいとき
- ラムダ式では書きにくい複雑な処理をしたいとき
returnを明確に使いたいとき
特に、関数からの戻り方にこだわりたいときは、ラムダ式よりも匿名関数の方が向いています。
4. 匿名関数の基本の書き方
もう一度、基本的な書き方を整理しておきましょう。
val 関数名 = fun(引数: 型): 戻り値の型 {
return 処理
}
たとえば、2つの数を足す匿名関数はこう書きます。
val add = fun(a: Int, b: Int): Int {
return a + b
}
println(add(3, 5))
5. ラムダ式ではできないこともできる
ラムダ式では、returnを書くと外側の関数に戻ってしまうことがあります。でも匿名関数では、自分の中だけでreturnが使えるのが特徴です。
val action = fun(x: Int): String {
if (x < 0) return "マイナス"
return "プラスかゼロ"
}
println(action(-3))
このように、ifとreturnを組み合わせて書きたいときにも、匿名関数は向いています。
6. 匿名関数とラムダ式の選び方のコツ
初心者のうちは、どちらを使えばいいか迷うこともあると思います。次のように覚えると使いやすいです。
- 短く書きたい → ラムダ式
- returnを使いたい → 匿名関数
- 複雑な処理や分岐がある → 匿名関数
- 簡単なフィルターや変換 → ラムダ式
7. 関数型の理解を深めるために
関数リテラルやラムダ式は、Kotlinの「関数型プログラミング」を理解するための大切な一歩です。最初は戸惑うかもしれませんが、何度か使ってみると違いや便利さがわかってきます。
関数を“データのように”変数に入れたり、他の関数に渡したりできるという考え方は、これまでのプログラミングとは少し違っていて面白い特徴です。
まとめ
Kotlinの関数リテラル(匿名関数)は、普段のプログラミングでよく使われるfunで名前をつける関数とは違い、その場だけで動かしたい処理を短くまとめるための便利な書き方でした。ラムダ式と見た目が似ていますが、returnの扱い方や、複雑な処理をまとめたい場面では匿名関数のほうが分かりやすく書けるという違いがありました。短いフィルターや簡単な処理にはラムダ式、明確にreturnを使いたいときや分岐が増えるときは匿名関数を選ぶと自然です。
実際に、valで変数のように扱えたり、引数として渡せたり、他の関数の戻り値にできたり、関数を「データ」のように扱えるのはとても大きな特徴です。これは、Kotlinが関数型プログラミングの考え方を取り入れている言語だから実現できる書き方です。普段のクラスやオブジェクトを使った開発とは少し違う感覚があり、最初は不思議に思うかもしれませんが、一度慣れてしまうと「あれ、ここはわざわざ関数名をつけなくてもいいな」と感じる場面が増えていくはずです。
たとえば、ボタンを押した時だけ実行したい処理、計算を一回だけまとめたい処理、コレクションのフィルタリングや変換など、ほんの少しの動きをまとめたいときに匿名関数を使うとコードが読みやすく整理しやすくなります。処理が複雑になりがちな場面では、ラムダ式だけを使うよりも匿名関数を使ったほうがコードがはっきり読みやすくなり、他の人が見たときにも理解しやすくなります。
また、匿名関数ではreturnが自分自身に対して働くので、外側の関数にまで戻ってしまう心配がありません。この違いは、実際に動かして試してみるとよく分かります。特に、短いラムダ式の中で複雑な分岐を書くと、どのタイミングでどこに戻るのか分かりにくくなることがありますが、匿名関数なら通常の関数と同じ書き方が使えるので安心です。
もう少し踏み込んで考えると、関数リテラルを活用することで、関数自体を「値」として扱える柔軟さが生まれます。たとえば、処理を「渡す」プログラミングができるようになり、条件によって違う計算を実行したり、コレクションの中身を並び替えたり、ひとまとまりの動きを自由に作れるようになります。これは、アプリやWeb開発でもとてもよく使われる考え方です。
次のサンプルは、匿名関数をリストの処理に渡して動かしてみた例です。
// 数字のリストから「偶数だけ」を取り出す処理を匿名関数で書く
val numbers = listOf(1, 2, 3, 4, 5, 6)
val isEven = fun(x: Int): Boolean {
return x % 2 == 0
}
val result = numbers.filter(isEven)
println(result) // [2, 4, 6]
このように、関数を変数として扱えることで、あとから別の処理に差し替えたり、組み合わせたりすることもできます。関数そのものを渡したり溜めたりする仕組みは、慣れてくるととても便利で、複雑な処理でも短く整理されたプログラムが書けるようになります。
さらに、関数リテラルは「関数型」を本当に理解するための入口でもあります。関数を作る、渡す、戻す。この考え方が分かると、ライブラリの使い方も理解しやすくなり、より多くのコードが短く読みやすい形に書けるようになります。特にKotlinでは、コレクションのmap、filter、forEachなど、関数を渡して動かす処理がたくさん使われます。実際のアプリ開発でも頻繁に登場する考え方です。
また、匿名関数とラムダ式の違いを知っておくと、問題に応じて「短く書く」「読みやすく書く」「returnを含めて分かりやすく書く」といった選び方ができるようになります。書き方の引き出しが増えると、コードはどんどんきれいになり、あとから見返したときの理解もずっと楽になります。
最初は少し難しく感じても、実際に使ってみると「この場面では匿名関数のほうがわかりやすい」と気づく瞬間が来ます。短いサンプルからでもいいので、実際に手を動かして書いてみるのが一番の近道です。
生徒
「匿名関数って、ただ短いだけじゃなくて、returnが普通に使えるのが便利なんですね。」
先生
「そうです。ラムダ式も良いのですが、複雑な処理になると匿名関数のほうが読みやすくなります。」
生徒
「リストに渡したり、変数として扱ったりできるのも面白いと思いました。」
先生
「関数を値として扱えると、コードの組み立てがとても自由になりますよ。」
生徒
「次は、自分で匿名関数を使った小さな処理を作ってみたいです!」