Edited at

Kotlinプロジェクトに投入されるJavaエンジニアのためのカンニングペーパー

More than 1 year has passed since last update.

最近ではAndroid界隈でKotlinを実務で採用するケースも増えつつあり、Javaを書いてきたエンジニアがすでにKotlin導入されたプロジェクトにジョインする事もままあるのではないでしょうか。

KotlinはJavaと互換性があり構文もJavaを踏襲している部分が多く学習コストは高くないですが、Javaエンジニアには馴染みのない書き方も多く使われます。

ここではJavaエンジニアがとりあえずKotlinのコードを読んだり書いたりするのに詰まらずスッとジョイン出来るように、よく使われる(気がする)Kotlinっぽい構文を雑に紹介してみます。

(Kotlinのざっくりとした言語仕様は把握している前提です)


Nullable


user.nameがnullだったら代わりに空文字を渡す

hoge(user.name ?: "")


userがnullだったら例外を投げる

hoge(user?.name ?: throw Exception())


userをnon-null型で再宣言(アンラップ) userがnullだったらreturn

val user = user ?: return


userがnullじゃなかったらlet内を実行(nameを出力) userがnullなら"null"を出力

user?.let { print(it.name) } ?: print("null")


Class、Property


lateinitでnon-null型を初期化せずに宣言

@Inject

lateinit var user: User

lateinitはnon-null型で扱いたいがコンストラクタで初期化出来ない場合に使う。

ActivityやFragmentのonCreateやDaggerのInjectで必ず初期化されるのが分かっている時に便利。

誤って初期前に参照するとエラーになる。


クラス宣言+コンストラクタ定義+プロパティ宣言

class User(val name: String) {

...
}

valやvarを付けるとnameはそのままプロパティになる。


コンストラクタ定義2

class User constructor(val name) {

...
}


親クラスのコンストラクタを呼ぶ

class PremiumUser(val rank: Rank, name: String) : User(name) {

...
}

子クラスのコンストラクタでrankとnameを受け取って、親クラスのコンストラクタにnameを渡している。


companion objectでstaticメソッドのようなものを宣言

class User(val name: String) {

companion object {
fun newInstance(): User {
return User("name")
}
}
}


companion objectをJavaから呼び出す

User user = User.companion.newInstance()


シングルトンオブジェクトを宣言してstaticメソッド用クラスとして使用する

object UserUtil {

fun doSomething()
}

UserUtil.doSomething()


HogeActivityのClassオブジェクトを取得

HogeActivity::class


HogeActivityのJavaのClassオブジェクトを取得(Intentに渡す場合などはこれ)

HogeActivity::class.java


匿名クラスのインスタンスを引数に渡す(メソッドが複数あってラムダ式が使えない場合に使用)

listView.setOnScrollListener(

object : AbsListView.OnScrollListener {
override fun onScrollStateChanged(view: AbsListView, scrollState: Int) {}
override fun onScroll(view: AbsListView, firstVisibleItem: Int, visibleItemCount: Int, totalItemCount: Int) {}
}
)


その他構文


Javaの三項演算子の代わりにif文を使って値を代入

val str = if (user.isPremium) "premium" else "normal" 

val str = if (user.isPremium) {

"premium"
} else {
"normal"
}


Javaのswitch文の代わりにwhenを使って値を代入

val str = when(user.Type) {

PREMIUM -> "premium"
NORMAL -> "normal"
else -> throw IllegalStateException("unknown type")
}


ラムダ式の引数宣言を省略してitを使う(この場合のitはView)

view.setOnClickListener { it.visibility = View.GONE }


ラムダ式の関数からreturnする

view.setOnClickListener { 

return@setOnClickListener
}


不変リスト宣言(addやremoveは出来ない)

val strs = listOf("a", "b", "c")


可変リスト宣言

val strs = mutableListOf("a", "b", "c")


関数の引数に関数を受け取る(高階関数)

fun initListAdapter(onItemClick: ((user: User) -> Unit)) {

...
}

Userを引数に取る関数をonItemClickという名前で受け取っている