本記事はCocone Advent Calendar 2022の20日目の記事となります。
はじめに
こんにちは。サーバーエンジニアをしているYです。
この記事では、Kotlin初心者がKotlinらしい書き方を模索しながら感じた、「Kotlin上級者になるために是非マスターしたいKotlinの要素」について紹介いたします。
自分がKotlinを扱い始めたのは約半年前。それまで主に扱っていたのはC++とJavaで、Kotlinはおろか、いわゆるモダンな書き方のJavaもほとんど扱ったことがありませんでした。
そんなわけで、今まで for(int i = 0; i < list.size(); i++) とか書いてた人間がKotlinに触れることになりました。
自分にとっては全く新しい言語!
ですが、書こうと思えばただJavaのキーワードを変換しただけのようなコードも書けてしまうのがKotlinです。
幸い自分が今のプロジェクトに参画した時には、既に偉大な先人たちが書いたKotlinらしいコードが存在していましたので、それらを参考に「Kotlinらしいコード」を模索する日々が始まりました。
それから約半年。ようやくKotlinに慣れてきたなと感じている現在、同じようにこれからKotlinに触れる方がKotlinらしいコードを書くにはどうすれば良いか、その手がかりになるような紹介ができればと思っています。
Kotlin上級者になるためにマスターしたいKotlinの要素
Kotlinには様々な特徴があります。書き方にも特徴がありますが、言語としての特徴は「簡潔で安全」であることです。
つまり、「より簡潔で、より安全なコード」が「Kotlinらしい書き方」ということになります。
そんな「Kotlinらしい書き方」をするために、自分が重要だと感じた要素を紹介していきたいと思います。
val
すごく基本的な要素なのですが、個人的にはKotlin上級者への第一歩だと思っている要素です。
Kotlinでは変数の定義する際に、値の再代入が可能な「var」と再代入不可の「val」のどちらかのキーワードを付ける必要があります。
そして、なるべく「val」を使うのが良いとされています。再代入ができなければ想定外の値が入るような事故が減るということですね。
Kotlin初心者だとそんなこと可能なのかと思ってしまいますが、後に挙げるコレクション操作やif式などを駆使していると、初期値の代入だけで済むパターンがほとんどです。
つまり、いかにvalで済むように考えることで、自然とKotlinらしい書き方を模索することができます。
(でもこだわり過ぎて複雑になるくらいならvar使った方が良いと思います。そのさじ加減も難しいですね)
コレクション操作
KotlinにはMapやListなどのコレクションを操作する関数がたくさん用意されています。検索、集約、変換……操作の内容は様々です。
そんなコレクションの操作は連結して書くことが可能なので、関数を知っていれば複雑な操作も連結させて1行で書くことができます。
そして1行で書ければ「val」を使うことができて、より簡潔で安全なコードになります。
というわけで、たくさんのコレクション操作関数をいかに使えるがKotlinらしいコードを書くことに繋がります。
ちなみに、コレクションを操作する関数の数は優に50を超えます。めちゃくちゃ多いですね。
関数によっては書き方が複数ある場合もあるので、それらも使いこなせればより書き方の幅が広がります。
まずはよく使う関数から覚えて、少しずつ色んな関数を覚えていきたいですね。
if・when式
個人的に一番「なんじゃこりゃ」と思った書き方がif式です。その名の通り、ifを式として使い値を返すことができます。
(代わりに三項演算子がないのでなるほどと思いました。)
if式を使うと、条件によって値が変わる変数への代入が、1行で書けるようになります。1行で書けるのでvalが使えて(以下略)というわけです。
また、PairやTripleを使えば最大3つまで値を返せるので、同じ条件で複数の値への代入も可能です。
val (hoge, fuga, aaa) = if (isFlag) {
Triple("a", "b", "c")
} else {
Triple("x", "y", "z")
}
whenはJavaのswitch文の代わりとして紹介されることが多いですが、個人的にはSQLのcase式に近いと思っています。
switch同様、値による条件分岐が可能です。さらにwhenは、引数を省略することで式による条件分岐も可能です。(この辺がcaseっぽいなと思うところ)
ifの代わりに使えば処理が簡潔になる場合があります。
エルビス演算子(?: )、セーフコール演算子(?.)
KotlinにはNull Safetyという特徴があり、nullを許容する変数かどうかは予め指定し、許容するならそれを想定した書き方をしなければいけません。
if(obj != null) のようなif文の代わりにエルビス演算子やセーフコール演算子を使うことで、null許容のオブジェクトに対する操作を連結して書くことができるようになり、簡潔なコードになります。
スコープ関数
スコープ関数は、あるインスタンスに対して何かしら複数の操作を行う際に用いられます。
apply, also, let, run, with の5種類があり、作成したインスタンスの初期値設定や、null許容のオブジェクトに対する操作などを簡潔に書けるようになります。
それぞれの関数で、呼び出し元への参照の仕方と戻り値が異なるので、用途に合わせて使い分けられるようになりたいところです。
おわりに
いかがでしたでしょうか。
今回はKotlin初心者向けということで、どれもKotlinに触れ始めたらすぐに出会う初歩的な要素ばかりだったかと思います。ですが、個人的にはそれらをいかに組み合わせて使いこなせるかが熟練度だと思っているので、今回このような形で紹介させていただきました。
自分も今回の記事を書くために色々調べながら「あぁあの処理はもっとこういう書き方ができたな」と改善の余地を見つけることができました。
みなさんもぜひ、より簡潔・安全なKotlinらしいコードを模索してみてください。
それでは、良いKotlinライフを!