MENU

JavaプログラマがKotlin書いてみて便利だったところ

こんにちは、虎の穴ラボのH.Kです。
虎の穴ラボに入ってはや2ヶ月、入社後に初めてKotlinに触れ、便利だなと感じたところをソースコードを交えご紹介したいと思います!
普段からKotlinを使っている先輩方からは「当たり前じゃん」と思われるかもしれませんが、少しでもKotlinの魅力を発信できれば幸いです。

著者情報

とりあえず自己紹介から。

  • 虎の穴ラボ入社2ヶ月
  • 前職ではJava(サーバサイド)がメイン
  • 虎の穴ラボ入社までKotlinの経験なし
  • 好きな食べ物は唐揚げ

観点としては"JavaからKotlinに移行してどのあたりがよかったか"というものになります。
※あくまでも私の主観です!!!!

What is Kotlin?

JetBrains社のJVM言語です。
Javaより簡潔に書けるという触れ込みです。
(本記事ではこの触れ込みについての所感も含まれます。)

kotlinlang.org


さて、ただ列挙しても仕方がないので、私が感動した順に書いていこうかと思います。
そのため、体系的な紹介とはなりませんが、ご了承ください。

拡張関数 use

Javaのtry-with-resourcesuseって書くだけで実現できてしまう!!
これにはとても感動しました。

kotlinlang.org

Javaのtry-with-resourcesが出たときも「めっちゃ便利やん!」って思ってましたが、そのとき以上の感動です。
サンプルコード

stream.bufferedReader().use { it.readText() } 

bufferedReader()の戻り値であるBufferedReader型はClosableであるため、上記の処理だけでException時にも自動でCloseしてくれます。
ちなみに拡張関数は既存のクラスに新しい関数やプロパティを追加する機能(=拡張)で作られた関数のことで、他にもコレクションに対して最大値を求める関数などが定義されています。

デフォルトのアクセス修飾子がpublic

Javaでプログラムを書いていて、ずっと思っていた疑問です。
なぜJavaのデフォルトのアクセス修飾子はpackage privateなのかと。
Kotlinではpublicであるため、classを作るたびにおまじないのように記述する必要がなくなります。

StringBuilderbuildStringで書ける!

文字列を結合するときにお決まりのように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のようなsettergetterだけを持つクラスを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

前回のライトニングトークイベントのレポートはこちらから!

toranoana-lab.hatenablog.com

そのほか、過去に開催したライトニングトークの様子についてはこちらをご確認ください!