ニフティ不動産のバッチ処理開発で感じた「Kotlinらしさ」
この記事は、ニフティグループ Advent Calendar 2024 12日目の記事です。
ニフティ不動産のシステム開発を行っている塚です。
今回は現在参画しているプロジェクトで学んだ、「Kotlinらしさ」について紹介したいと思います。
みなさんは「Kotlin」と聞いた時に何を思い浮かべますか?
Android開発を思い浮かべる方もいるかと思いますが、webやバッチ処理などさまざまなシステムの開発にも活用できます。そのため、弊社のプロジェクトにおいても、Kotlinを採用するケースが多いです。
現在参画しているプロジェクトでは、バッチシステムのリニューアルを行っており、Javaで書かれていたバッチをKotlinに置き換えています。KotlinはJavaとの互換性が高いですが、ただ単にコードをKotlinに書き換えるだけなく、Kotlinの良さを最大限に活かした「Kotlinらしい」実装を意識することで、シンプルで見通しの良いスッキリとしたコードになります。スッキリとしたコードは、読みやすく、書きやすいため日々の開発業務のストレスを軽減してくれるメリットがあります。
実際にKotlinを触って感じた「Kotlinらしさ」
エンティティを表すクラスを簡潔に表現できる
単純なエンティティを表すクラスを作成することを考えます。Javaの場合はプロパティの定義、コンストラクタ、getterの定義など、最低限の実装だけでも煩雑になってしまいます。Kotlinではデータクラスを使うだけで簡単に実装でき、getterやsetter、toString()、equals()など一部の機能も自動で実装されます。
// Java
class Player {
private int id;
private String name;
public Player(int id, String name) {
this.id = id;
this.name = name;
}
public int getId() { return id; }
public String getName() { return name; }
}
// Kotlin
data class Player(
val id: Int,
val name: String
)
型推論があるので、変数の定義がシンプル
Kotlinは型推論があるため、必要な場合を除いて型を明示する必要がありません。
// Java
List<Player> playerList = List.of(
new Player(1, "Tanaka"),
new Player(2, "Suzuki"),
new Player(3, "Tanaka")
);
// Kotlin
val playerList = listOf(
Player(1, "Tanaka"),
Player(2, "Suzuki"),
Player(3, "Tanaka")
)
リストや配列などのコレクション操作の使いやすさ
Kotlinのリスト操作は非常に直感的です。JavaのストリームAPIと似ていますが、Kotlinだとよりシンプルな記述が可能です。
// Java
List<List<Object>> result = playerList.stream()
.filter(player -> "Tanaka".equals(player.getName()))
.map(player -> List.of(player.getId(), player.getName()))
. collect(Collectors.toList());
// -> result: [[1, Tanaka], [3, Tanaka]]
// Kotlin
val result = playerList
.filter { player: Player -> player.name == "Tanaka" }
.map { player: Player -> listOf(player.id, player.name) }
// -> result: [[1, Tanaka], [3, Tanaka]]
ラムダ式の使いやすさ
Kotlinのラムダ式は引数が一つの場合、暗黙的に it を使うことができるため簡潔に記述できます。
// it を利用しない場合
val result = playerList
.filter { player: Player -> player.name == "Tanaka" }
.map { player: Player -> listOf(player.id, player.name) }
// -> result: [[1, Tanaka], [3, Tanaka]]
// it を利用した場合
val result = playerList
.filter { it.name == "Tanaka" }
.map { listOf(it.id, it.name) }
// -> result: [[1, Tanaka], [3, Tanaka]]
おわりに
Kotlinらしい実装を意識することで、コードの見通しが良くなったのが一番良かった点だと思います。従来のJavaのコードでは記載量も多く、コードの意図を把握するのにとても苦労しました。
KotlinはJavaの単なる代替ではなく、安全でシンプルな実装を可能にしてくれます。
みなさんもKotlinを使って「Kotlinらしい」コードを書いてみましょう!
掲載内容は、記事執筆時点の情報をもとにしています。