#Kotlinのあれこれ
Android StudioでKotlinを使用しながら、Androidアプリ開発に関して学んでいます。
Javaの基礎知識があればKotlinの学習は必要ないと上司から言われていましたが、全然そんなことないと思っています。(泣)
確かにオブジェクト思考を前提としたプログラミングではありますが、Javaと比較してKotlinは型推定が常識のように行われるためにいきなりライブラリの仕様等を見ると心が折れます。
#高階関数とそれに組み合わさるあれこれ
前回に関数オブジェクトについて書かせていただきました。
関数オブジェクトが本領を発揮するのは、関数の引数として与えたり、返り値として返すことができる点です。
高階関数は関数を引数として受け取って動作する関数です。
今回は関数オブジェクトを引数として渡す方法や、それに書き換えられるラムダ式と絡めて記事を書いてみます。
#早速コードを見てみよう
まずは実際に動作するコードを確認してみましょう。
以下は受け取った文字を出力する関数オブジェクトcharPrint
を高階関数forEach
に引数で渡しています。
このプログラムの流れがわかる方はこの記事はお役に立てないかもしれません。
fun forEach(s: String, x: (Char) -> Unit) {
for (c in s) {
x(c)
}
}
fun charPrint(c: Char): Unit{
println(c)
}
fun main() {
val funObject = ::charPrint
forEach("aiueo", funObject)
}
実行結果は以下のようになります。
..> a
..> i
..> u
..> e
..> o
文字を受けとって表示する関数オブジェクトを引数に受け取って、もう一つの引数の文字列を一文字ずつ表示する関数になっていますね!
charPrint
のところの: Unit
は型推論ができるので省略しても大丈夫です。
: Unit
は戻り値のない関数に記述するのでしたね!
Javaでいうvoidみたいなものですかね。
これは以下のようにも書くことができます。
ラムダ式を使用した記述方法です。
fun forEach(s: String, x: (Char) -> Unit) {
for (c in s) {
x(c)
}
}
fun main() {
forEach("aiueo", {c: Char ->
println(c)
})
}
これでも同じ実行結果を得ることができます。
さらにラムダ式は引数が一つのときに限り、暗黙の変数itを使用することができます。
なので、mainの部分は以下のように書き換えることができます。
fun main() {
// forEach("aiueo", {c: Char ->
// println(c)
// })
forEach("aiueo", {
println(it)
})
}
構文糖衣(syntax sugar)も使用すると、以下のように書き換えることができます。
fun main() {
// forEach("aiueo", {c: Char ->
// println(c)
// })
forEach("aiueo"){println(it)}
}
Kotlinには書き換える方法が多く、初めて見ると色々な書き方に困惑してしまうと思います。
私も未だによく混乱してしまいます。
仕組みや学ぶ順序を意識して、なぜこの書き方が良いのかという点も含めて理解すると良いと思います。
最後に
相変わらずJavaやC言語でなれている人にとってはあまり馴染みのない書き方ですね。
次回はAndroidアプリの開発に関わる記事について書いてみようと思います。
#とりあえず。。。
メモ代わりに書いていますが、これから理解が深まれば書き足していきます。
いつか誰かのお役に立てると嬉しいですね。
初学者から一人前まで、、、
ここでは一人前のプログラマの定義を
「おおよそ自力で様々なツールを活用しながら、ある程度思い通りの実装ができること」
とします。
また、人生においてプログラミングに向き合う時間として、現時点で2000時間取り組めればある程度の基盤が備わると仮定しています。
(言語やツールに依存しない思考法や情報収集能力)
プログラミングは大学で学んで来ましたが、特に根詰めてやってきていないので、ノーカウントとして取り組みます。
現在までの学習時間
およそ450時間
どんどん更新していきます。