こんにちは、虎の穴ラボのH.Kです。
虎の穴ラボに入ってはや2ヶ月、入社後に初めてKotlinに触れ、便利だなと感じたところをソースコードを交えご紹介したいと思います!
普段からKotlinを使っている先輩方からは「当たり前じゃん」と思われるかもしれませんが、少しでもKotlinの魅力を発信できれば幸いです。
著者情報
とりあえず自己紹介から。
- 虎の穴ラボ入社2ヶ月
- 前職ではJava(サーバサイド)がメイン
- 虎の穴ラボ入社までKotlinの経験なし
- 好きな食べ物は唐揚げ
観点としては"JavaからKotlinに移行してどのあたりがよかったか"というものになります。
※あくまでも私の主観です!!!!
What is Kotlin?
JetBrains社のJVM言語です。
Javaより簡潔に書けるという触れ込みです。
(本記事ではこの触れ込みについての所感も含まれます。)
さて、ただ列挙しても仕方がないので、私が感動した順に書いていこうかと思います。
そのため、体系的な紹介とはなりませんが、ご了承ください。
拡張関数 use
!
Javaのtry-with-resources
がuse
って書くだけで実現できてしまう!!
これにはとても感動しました。
Javaのtry-with-resources
が出たときも「めっちゃ便利やん!」って思ってましたが、そのとき以上の感動です。
サンプルコード
stream.bufferedReader().use { it.readText() }
bufferedReader()
の戻り値であるBufferedReader
型はClosable
であるため、上記の処理だけでException
時にも自動でClose
してくれます。
ちなみに拡張関数は既存のクラスに新しい関数やプロパティを追加する機能(=拡張)で作られた関数のことで、他にもコレクションに対して最大値を求める関数などが定義されています。
デフォルトのアクセス修飾子がpublic
!
Javaでプログラムを書いていて、ずっと思っていた疑問です。
なぜJavaのデフォルトのアクセス修飾子はpackage private
なのかと。
Kotlinではpublic
であるため、class
を作るたびにおまじないのように記述する必要がなくなります。
StringBuilder
がbuildString
で書ける!
文字列を結合するときにお決まりのようにStringBuilder
のインスタンスを作り、append()
していき、最後にtoString()
で文字列を取り出す、という工程を行っていましたが、インスタンス作成とtoString()
が不要になっています。
サンプルコード
fun concat(str1 : String, str2 : String, str3 : String) = buildString {
append(str1)
append(str2)
append(str3)
}
地味ですが、Kotlinは"関数の中身が式1つだけなら波括弧は省略できる"ので簡潔に記述でき、確かに「便利だ!」と感じる機能です。
関数のデフォルト値を定義できる!
例えばJavaで"1ページあたり10件表示がデフォルトで指定があったときだけ、表示数を引数の値にする"という仕様を実現しようとすると以下のようになります。
private static final Integer DEFAULT_PAGE_SIZE = 10; public List<Object> pager(List<Object> list , Integer pageSize) { if(pageSize == null){ pageSize = DEFAULT_PAGE_SIZE; } // リストに対する処理など }
それがKotlinの場合だと以下のようにスッキリ記述できます。
fun pager(list : List<Any>,pageSize : Int = DEFAULT_PAGE_SIZE) : List<Any> { // リストに対する処理など } companion object { private const val DEFAULT_PAGE_SIZE = 10 }
Javaであればoverload
を使わないといけないようなところであってもデフォルト値を設定することで同じ名前の関数をいくつも実装しなくて済み、感動しました。
data classで簡単にDTO作成!
KotlinではDTOのようなsetter
とgetter
だけを持つクラスをdata classで定義します。
data classで定義することによりhashCode
, equals
, toString
に加え、copy
という、一部を書き換え、別インスタンスを作成する関数が追加されます。ただ、Javaのclone
とは違い、シャローコピーとなります。
サンプルコード
data class User(val name : String, val age : Int) val hanako = User(name = "山田花子", age = 20) val marriedHanako = hanako.copy(name = "田中花子") // 田中花子(20歳)のインスタンスが生成される
JavaではIDEの自動生成やlombokで行っていましたが、こちらの方が楽で、なおかつ可読性が高いです。
まとめ
まだ使い始めて2ヶ月ですが、Javaでは冗長に記述せざるを得なかったものが短く記述でき快適にプログラミングできています。
もちろん、Kotlinには今回挙げた以外にもString Templateや複数行の文字列リテラル、Scope Functionsなど、便利な機能はたくさんあります。
記法を多く学び、よりBestに近いKotlinのコードを書いていきたいです。
またnullに関する扱いについてまだ慣れていないところがあり、戸惑うこともありますが、多くのプログラムに触れる中で慣れていきたいです。
P.S
虎の穴では一緒に働く仲間を絶賛募集中です! この記事を読んで、興味を持っていただけた方はぜひ弊社の採用情報をご覧下さい。 yumenosora.co.jp
10/30(水)に『オタクが最新技術を追うライトニングトークイベント in 渋谷』を開催いたします。
一般参加者、LT参加者、どちらも募集しておりますので、ご興味のある方は是非ご応募ください!
yumenosora.connpass.com
前回のライトニングトークイベントのレポートはこちらから!
そのほか、過去に開催したライトニングトークの様子についてはこちらをご確認ください!