0Pricing
Android Academy · レッスン

拡張関数と高階関数

拡張関数で既存の型に振る舞いを追加し、高階関数とスコープ関数(let、apply、also、run、with)を使って表現力豊かなKotlinコードを書きます。

「拡張関数と高階関数」はCoddyKit上の無料Android Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはAndroid Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Android Academyコースには全4レッスンが含まれています。

拡張関数

拡張関数を使うと、既存のクラスを変更したり継承したりせずに、そのクラスへ新しい関数を追加できます。String、Int、自作クラス、さらにはAndroidのViewも拡張できます。

構文:fun TypeName.functionName() { }

拡張関数の作成

拡張関数の内部では、thisがレシーバーオブジェクトを参照します。

fun String.isPalindrome(): Boolean {
    val cleaned = this.lowercase().filter { it.isLetter() }
    return cleaned == cleaned.reversed()
}

fun Int.isEven() = this % 2 == 0

fun main() {
    println("racecar".isPalindrome())  // true
    println("hello".isPalindrome())    // false
    println(4.isEven())                // true
    println(7.isEven())                // false
}

Android Viewの拡張関数

Androidでよく使われるパターンです。定型コードを繰り返す代わりに、拡張関数でViewの表示と非表示を切り替えます。

import android.view.View

fun View.show() { visibility = View.VISIBLE }
fun View.hide() { visibility = View.GONE }
fun View.invisible() { visibility = View.INVISIBLE }

// Usage in Activity:
// binding.progressBar.show()
// binding.recyclerView.hide()

高階関数

高階関数とは、関数をパラメーターとして受け取るか、関数を返す関数です。すでに使用したことのあるfilter、map、forEachは、すべて高階関数です。

関数型の構文:(ParamType) -> ReturnType

関数をパラメーターとして渡す

別の関数を受け取る関数を定義します。

fun operate(a: Int, b: Int, op: (Int, Int) -> Int): Int {
    return op(a, b)
}

fun main() {
    val sum  = operate(3, 4) { x, y -> x + y }
    val prod = operate(3, 4) { x, y -> x * y }
    val max  = operate(3, 4, ::maxOf)   // method reference

    println(sum)   // 7
    println(prod)  // 12
    println(max)   // 4
}

関数を返す

関数は別の関数を返すこともできます。設定可能な動作を構築する場合に便利です。

fun makeMultiplier(factor: Int): (Int) -> Int {
    return { number -> number * factor }
}

fun main() {
    val double = makeMultiplier(2)
    val triple = makeMultiplier(3)

    println(double(5))   // 10
    println(triple(5))   // 15

    val numbers = listOf(1, 2, 3, 4)
    println(numbers.map(double))  // [2, 4, 6, 8]
}

スコープ関数:let

Kotlinのスコープ関数は、オブジェクトに対してブロックを実行し、結果を返します。letはnullチェックや変換に使用します。

fun main() {
    val name: String? = "Alice"

    // Only runs if name is not null
    name?.let {
        println("Name length: ${it.length}")
        println("Upper: ${it.uppercase()}")
    }

    // Transform a value
    val length = name?.let { it.length } ?: 0
    println("Length: $length")  // 5
}

スコープ関数:applyとalso

applyはオブジェクトを設定し、オブジェクト自体を返します。alsoは副作用を実行し、オブジェクトを返します。

data class Config(var host: String = "", var port: Int = 0, var timeout: Int = 0)

fun main() {
    // apply: configure an object (this = receiver)
    val config = Config().apply {
        host = "api.example.com"
        port = 443
        timeout = 30
    }
    println(config)  // Config(host=api.example.com, port=443, timeout=30)

    // also: log or debug (it = receiver)
    val result = listOf(1, 2, 3)
        .also { println("Original: $it") }
        .map { it * 2 }
        .also { println("Doubled: $it") }
}

スコープ関数:runとwith

runはオブジェクトに対してブロックを実行し、そのブロックの結果を返します。withも似ていますが、拡張関数ではありません。

data class User(val name: String, val age: Int)

fun main() {
    val user = User("Bob", 30)

    // run: compute something using the object
    val greeting = user.run {
        if (age >= 18) "Hello, $name!" else "Hi, $name!"
    }
    println(greeting)  // Hello, Bob!

    // with: group operations on an object
    val info = with(user) {
        "Name: $name, Age: $age"
    }
    println(info)  // Name: Bob, Age: 30
}

スコープ関数チートシート

適切なスコープ関数を選ぶためのクイックリファレンスです。

  • let — null安全なブロック、オブジェクトの変換、ラムダの結果を返す
  • apply — オブジェクトを設定し、オブジェクト自体(this)を返す
  • also — 副作用(ログ出力など)を実行し、オブジェクト自体(it)を返す
  • run — オブジェクトから結果を計算し、ラムダの結果を返す
  • with — オブジェクトに対する呼び出しをまとめる。拡張関数ではない

inline関数とreified

高階関数にinlineを付けると、実行時のラムダオブジェクトの割り当てを避けられます。reifiedを使うと、通常は消去されるジェネリック型Tを実行時に使用できます。

inline fun <reified T> Any.isOfType(): Boolean = this is T

fun main() {
    println("hello".isOfType<String>())   // true
    println(42.isOfType<String>())         // false
    println(3.14.isOfType<Double>())       // true
}

確認問題

新しく作成したオブジェクトを設定し、同じオブジェクトを返すのに最適なスコープ関数はどれですか。

まとめ:拡張関数と高階関数

Kotlinの関数型ツールキットを使えるようになりました。

  • 拡張関数 — 継承せずに任意の型へ機能を追加
  • 高階関数 — 柔軟なAPIのために関数を渡したり返したりする
  • スコープ関数:let(nullチェック)、apply(設定)、also(副作用)、run/with(計算)
  • inline + reified — 実行時の型情報を持つ、オーバーヘッドのないラムダ

次は、Fragmentsを使って複数画面のアプリを構築します。

よくある質問

「拡張関数と高階関数」レッスンは無料ですか?

はい。「拡張関数と高階関数」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Android Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Android Academyコースには全4レッスンが含まれています。

「拡張関数と高階関数」で何を学びますか?

拡張関数で既存の型に振る舞いを追加し、高階関数とスコープ関数(let、apply、also、run、with)を使って表現力豊かなKotlinコードを書きます。 ブラウザで直接実行するハンズオンコードでAndroid Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Android Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのAndroid Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「拡張関数と高階関数」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このAndroid Academyレッスンでコードを書いて実行できますか?

はい。すべてのAndroid Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Null安全
  2. クラスとオブジェクト
  3. データクラスとsealedクラス
  4. 拡張関数と高階関数
← Android Academyに戻る