この記事は、@AndroidDev による #31DaysOfKotlin — Week 1 Recap を勝手に日本語訳したものです。 基本的な文法からちょっとした TIPS まで様々なことが紹介されているので、知らないものがあったらぜひ使ってみてください。
Null チェックをよりスマートにするには、エルビス演算子を使ってみましょう。
Null を別の値に置き換えたり、あるいはreturn
したりもできます!
Docs: Elvis Operator
val name: String = person.name ?: “unknown”
val age = person.age ?: return
文字列に変数を埋め込むには、変数名の前に$
を入れましょう。
式を入れるには${expression}
のようにしてください。
Docs: String Templates
val language = “Kotlin”
// “Kotlin has 6 characters”
val text = “$language has ${language.length} characters”
Android KTX では、色の成分値を割り当てるのに分解宣言を使用します。 自作のクラス内で分割代入を使用できますし、既存のクラスを拡張して追加することも可能です。(日本語名称について参考にした記事) Docs: Destructing Declarations
// 色要素
val (red, green, blue) = color
// 四角形
val (left, top, right, bottom) = rect
// 座標
val (x, y) = point
条件分岐をよりよく書くにはwhen
式を使ってみましょう。
Kotlin のwhen
式は、文字列リテラルや Enum、Range など何にでも使用できます!任意の関数を呼ぶことも可能です。
Docs: When
class Train(val cargo: Number?) {
override fun toString(): String {
return when (cargo) {
null, 0 -> "empty"
1 -> "tiny"
in 2..10 -> "small"
is Int -> "big inty"
else -> "$cargo"
}
}
}
for
ループは Kotlin の Range や分解宣言を使うと便利です。
Docs: Ranges, Destructuring
// 1 から 100 まで
for(i in 1..100) {…}
// 1 から 100 まで降順
for(i in 100 downTo 1){…}
// 配列の要素を1つ飛ばしで
val array = arrayOf(“a”, “b”, “x”)
for(i in 1 until array.size step 2 ){…}
// 配列の要素を分解宣言で取り出す
for((index, element) in array.withIndex()) {…}
// Map の要素を分解宣言で取り出す
val map = mapOf(1 to “one”, 2 to “two”)
for( (key, value) in map){…}
Kotlin では、クラスのプロパティのゲッターとセッターが自動生成されます。必要に応じてカスタマイズすることも可能です。 Docs: Properties
class User {
// properties
val id: String = “” // 変更禁止。ゲッターのみ
var name: String = “” // デフォルトのゲッターとセッター
var surname: String = “” // カスタムゲッターとデフォルトのセッター
get() = surname.toUpperCase() // custom getter declaration
var email: String = “” // デフォルトのゲッターとカスタムセッター
set(value) { // カスタムセッターの宣言
// “value” = セッターのパラメータ
// “field” = 自動生成されるバッキングフィールド
if(isEmailValid(value)) field = value
}
}
データの保持だけが目的であれば、データクラスを使ってみましょう。構造的等価性 (Structual Equality) をチェックするequals()
やhashCode()
,toString()
,copy()
などの関数が自動生成されます。
Docs: Data Classes, Equality
data class User(
val name: String,
val email: String,
val address: Address,
…
)
public class UserListDiffCallback: DiffUtil.Callback() {
override fun areContentsTheSame(
oldItemPosition: Int,
newItemPosition: Int
): Boolean {
// 自動生成された比較メソッドを使用
return newUserList[newItemPosition] ==
oldUserList[oldItemPosition])
}