[2023] Kotlin チュートリアル
記事ディレクトリ
パート II オブジェクト指向プログラミングと関数型プログラミング
第 13 章 関数型プログラミングの基礎 — 高階関数とラムダ式
関数型プログラミングの考え方はオブジェクト指向と同じくらい古いものですが、関数型プログラミングをサポートするコンピューター言語が登場したのはごく最近のことです。これらの言語には、Swift、Python、Java 8、および C++ 11 が含まれます。新しい言語として、Kotlin は関数型プログラミングもサポートします。
13.3 ラムダ式
ラムダ式は、式、関数パラメータ、および関数の戻り値として使用できる匿名関数です. ラムダ式の演算結果は関数です.
13.3.3 ラムダ式の簡略化された記述
Kotlin では、Lambda 式を簡単に記述するためのさまざまな方法が提供されています。その一部を以下に紹介します。
[1] 単純化されたパラメーター型の派生
型推定は Kotlin の強みであり、Kotling コンパイラはコンテキストに従ってパラメーターの型と戻り値の型を推定できます。次のコードは、標準形式のラムダ式です。
{
a:Int, b:Int -> a + b}
Kotlin は、パラメーター a と b が Int 型であり、もちろん戻り値も Int 型であると推測できます。簡略化された形式は次のとおりです。
{
a, b -> a + b}
この簡略化を使用して変更された calculate 関数のコードは次のとおりです。
private fun calculate(opr: Char): (Int, Int) -> Int = when (opr) {
'+' -> {
a, b -> a + b }
'-' -> {
a, b -> a - b }
'*' -> {
a, b -> a * b }
else -> {
a, b -> a / b }
}
fun main() {
val f1 = calculate('+')
val f2 = calculate('-')
val f3 = calculate('*')
val f4 = calculate('/')
println(f1(10, 5))
println(f2(10, 5))
println(f3(10, 5))
println(f4(10, 5))
}
[2] 末尾の Lambda 式を使用する
ラムダ式は関数のパラメータとして渡すことができます. ラムダ式が非常に長い場合, プログラムの可読性に影響します. 関数の最後のパラメーターが Lambda 式の場合、この Lambda 式を関数の括弧の後に配置できます。
サンプルコードは次のとおりです。
fun calculatePrint1(funN: (Int, Int) -> Int) {
// 使用funN 参数
println("${
funN(10, 5)}")
}
// 打印计算结果函数
fun calculatePrint(n1: Int, n2: Int, opr: Char, funN: (Int, Int) -> Int) {
println("$n1 $opr $n2 = ${
funN(n1, n2)}")
}
fun main() {
calculatePrint(10, 5, '+', {
a: Int, b: Int -> a + b }) // 标准形式
calculatePrint(10, 5, '-') {
a, b -> a - b } // 尾随Lambad表达式形式
calculatePrint1({
a, b -> a + b }) // 标准形式
calculatePrint1() {
a, b -> a + b } // 尾随Lambda表达式形式
calculatePrint1 {
a, b -> a + b } // 尾随Lambda表达式, 如果没有参数可以省略()
}
[注意] 後続の Lambda 式は関数宣言と間違われやすい
[3] パラメータ宣言を省略する
Lambda 式のパラメータが 1 つしかなく、そのデータ型がコンテキストに従って推測できる場合、このパラメータ宣言は省略でき、暗黙的なパラメータは Lambda 本体で使用され、Lambda 式のパラメータを置き換えます。 . サンプルコードは次のとおりです。
fun reverseAndPrint(str: String, funN: (String) -> String) {
val result = funN(str)
println(result)
}
fun main() {
reverseAndPrint("hello", {
s -> s.reversed() }) // 标准形式
reverseAndPrint("hello", {
it.reversed() }) // 省略参数, 使用隐式参数it
val result1 = {
a: Int -> println(a) } // 不能省略参数声明
val result2: (Int) -> Unit = {
println(it) } // 可以省略函数声明
result1(20)
result2(30)
}
文字列を反転して出力する 高階関数 revreseAndPrint は、2 番目の引数として関数型を取ります。
Lambda 本体の it 暗黙変数は Kotlin コンパイラによって生成され、その使用には 2 つの前提条件があることに注意してください。
- 1 つは、Lambda 式にパラメーターが 1 つしかないことです。
- 2 つ目は、コンテキストに応じてパラメーターの型を推測できることです。
コードを比較するとval result1 = { a: Int -> println(a) } // 不能省略参数声明 val result2: (Int) -> Unit = { println(it) } // 可以省略函数声明
、result1 のデータ型が指定されていないため、コンパイラは Lambda 式のパラメーターの型を推測できず、使用できないことがわかります。そしてresult2はデータ型(Int)→Unitが割り当てられており、コンパイラはLambda:式のパラメータの型を推測できるので利用できます。