KotlinLearning: 04-1 拡張関数

11/06/2021

拡張関数とは

クラスの継承やオーバーライドは基底クラスが変更された際に影響を受ける可能性があるため、一般的にアンチパターンと言われています。
拡張関数を使用すればクラスを継承して新しいクラスを作成せずに、あるクラスの機能を増やすことが出来ます。
元々のクラス名のままで機能を追加でき、標準ライブラリの関数も簡単にカスタマイズできます。

例えばJavaの標準のStringクラスではlengthフィールドから文字数を取得する必要がありましたが、KotlinではString型にその文字列の文字数を返すcount関数を実装しています。

val stringCount = "String Message".count()
print(stringCount)

このcount関数は高階関数として定義されているので、関数型の引数を取ることができます。
例えば文字列の中の s の文字数をカウントしたい場合、引数としてラムダをcount関数に渡します。

val stringCount = "String Message".count({letter -> letter == 's'})
print(stringCount)

この{}内に書かれているものがラムダ、またはラムダ式と呼ばれているものです。

ラムダは第一級オブジェクトのためリテラルとして変数に保存することが出来ます。
変数に保存すれば任意のタイミングでラムダを実行したり、通常の参照型変数と同様他の関数に渡したり戻り値として返したりすることもできます。
この時、変数の型を関数型といいます。

以下は(String型を引数に取りInt型を戻り値とする関数)型の変数stringCountを定義しています。
変数の中身、つまり関数の処理は、String型の値を変数inputで受け取り、そのlengthを返すというものです。

val stringCount: (String) -> Int = { input ->
	input.length
}

一般的な関数と同様、ラムダも任意の数の式を含めることが可能ですが、そもそもの用途として小さなコード片が想定されています。
一目でわかる程度の簡単な処理のみを記述するようにしましょう。
return文がありませんが、最後の式の結果が戻り値になります。

また上記コードは関数型の変数stringCountの定義であって、関数やラムダを実際に呼び出しているわけではありません。
呼び出すには()を用い、String型の引数を渡します。

val stringCount : (String) -> Int = { input ->
	input.length
}
val stringLength: Int = stringCount("Android")

Advertisements

Kotlin

Posted by codive