高階関数
高階関数とは、ある関数を引数に持つような関数のことです。
関数を引数として渡すというのは、もう少し言うと関数の参照を渡すということです。
関数の参照は、関数名の前に「::」をつけることで取得できます。
例えば、次のサンプルのgetNonNullのような関数です。
fun main(args: Array) {
val fruits = listOf("apple", "banana", "orange", "peach")
// 関数名の前に::をつけることで関数を参照を取得できる
val subList = filter(fruits, ::isContainsP)
println(subList)
}
fun filter(source: List, condition: (String) -> Boolean): List {
val ret = mutableListOf()
for (i in source) {
if (condition(i)) {
ret.add(i)
}
}
return ret;
}
fun isContainsP(str: String): Boolean {
// pを含むかどうかチェック。大文字小文字は無視する
return str.contains('p', true)
}
[apple, peach]
ラムダ式
上記のサンプルの「isContainsP」ですが、たったこれだけの機能のためにわざわざ関数を作るのはめんどくさいです。
しかも、P以外のさまざまな条件も使いたいとなったときに、その条件の数だけ単純な関数を用意しようと思うと、もっとめんどくさいです。
そこで、単純な(式が1,2個程度の)関数を簡単便利に表現する機能があります。それがラムダ式です。
ラムダ式の基本的な書き方は以下の通りです。
{ 引数 -> 式 }
引数の型は省略可能な場合もあります。
それでは、実際にサンプルを見てみましょう。
fun main(args: Array) {
val fruits = listOf("apple", "banana", "orange", "peach")
// ラムダ式を利用すると簡単に記述できる
val subList = filter(fruits, { str -> str.contains('p', true) })
println(subList)
}
fun filter(source: List, condition: (String) -> Boolean): List {
val ret = mutableListOf()
for (i in source) {
if (condition(i)) {
ret.add(i)
}
}
return ret;
}
[apple, peach]
it
高階関数の引数が1つのみの場合、その引数の宣言を(->を含めて)省略して「it」で表すことができます。
fun main(args: Array) {
val fruits = listOf("apple", "banana", "orange", "peach")
// 引数が一つのみの場合、省略してitで代用可能
val subList = filter(fruits, { it.contains('p', true) })
println(subList)
}
fun filter(source: List, condition: (String) -> Boolean): List {
val ret = mutableListOf()
for (i in source) {
if (condition(i)) {
ret.add(i)
}
}
return ret;
}
[apple, peach]