Kotlin演算子(Operators)
演算子(Operators)
演算子の種類は次のとおりである。
算術演算子(additiveOperator, multiplicativeOperator)
算術演算子は、加算、減算、除算、乗算、剰余演算を行う。
expr1 + expr2 // 足し算
expr1 - expr2 // 引き算
expr1 * expr2 // 掛け算
expr1 / expr2 // 割り算
expr1 % expr2 // 剰余
代入演算子
代入演算子は、特定の変数に値を入れるときに使用する演算子である。
var = value // 代入
複合代入演算子
複合代入演算子は、算術演算子と代入演算子を組み合わせた演算子である。
var += value // var = var + valueと等価
var -= value // var = var - valueと等価
var *= value // var = var * valueと等価
var /= value // var = var / valueと等価
var %= value // var = var % valueと等価
正数、負数、インクリメント・デクリメント演算子
増減演算子は、変数の値を1ずつ加算または減算する演算子である。
+var // 正数
-var // 負数
var++ // 後置(postfix)インクリメント演算子(増加前の値を返す)
++var // 前置(prefix)インクリメント演算子(増加後の値を返す)
var-- // 後置(postfix)デクリメント演算子(減少前の値を返す)
--var // 前置(prefix)デクリメント演算子(減少後の値を返す)
比較演算子(equalityOperator, comparisonOperator)
比較演算子は、2つの変数の大小関係、値、オブジェクトを比較するときに使用する。
expr1 == expr2 // 同じ
expr1 != expr2 // 同じではない
expr1 === expr2 // 同じ(参照比較)
expr1 !== expr2 // 同じではない(参照比較)
expr1 < expr2 // 小さい
expr1 <= expr2 // 以下
expr1 > expr2 // 大きい
expr1 >= expr2 // 以上
論理演算子
論理演算子は真(true)、偽(false)を扱う。
!expr1 // 否定(NOT)
expr1 && expr2 // 論理積(AND)
expr1 || expr2 // 論理和(OR)
配列および範囲演算子
arr[...] // 配列要素を参照
*arr // スプレッド演算子(配列を展開)
n..m // 範囲(range)
var in arr // 含む
null safe演算子
var?.prop // varがnullならnull、そうでなければvar.prop(Safe call)
var ?: expr // varがnullでなければvar、そうでなければexpr(Elvis operator)
var!! // varがnullではないと宣言
nullを参照することは非常に危険である。nullの値を参照するとNullPointerExceptionが発生する。
Kotlinでは、このような例外を発生させないようにNullable型を提供している。
fun moneyStatus(name: String, money: Int?): String? {
return "$name 님의 재산은 ${money?:"0"}원 입니다."
}
fun main(args:Array<String>) {
var name1: String = "devkuma" // non-null
//name1 = null // error
var name2: String? = "kotlin"
name2 = null;
println("name1.length = ${name1.length}")
println("name2.length = ${name2?.length}")
println(moneyStatus("kimkc",2000000000))
println(moneyStatus("devkuma",null))
val framework:String? = "spring"
println(framework?.uppercase())
val library:String? = null
println(library?.uppercase())
println(library!!.uppercase());
}
name1.length = 7
name2.length = null
kimkc 님의 재산은 2000000000원 입니다.
devkuma 님의 재산은 0원 입니다.
SPRING
null
?演算子
Kotlinで基本的な変数宣言をするときは、nullを持てない。そのため、通常の変数にnullを代入するとコンパイルエラーが発生する。nullを宣言したい場合は、nullableな変数にするため、変数の型の後ろに疑問符(?)を付ければよい。
var a:String? = null
上のaの値はnullになり得ることを意味する。
var a:String = "devkuma"
var b:String = null
println(a.length) // 7
println(b?.length) // null
b.lengthは、bがnullであるためlengthで参照するとNullPointerExceptionが発生する。
b?.lengthとするとnullが返される。
!!演算子
var b:String? = null
println(b!!.length) // NPE
nullでなければその値を返し、nullならNullPointerExceptionが発生する。
Elvis(?:)演算子
var library:String? = null
println(library?.uppercase())
//println(library!!.uppercase())
println("ライブラリ ${library ?: "ありません。"}")
Elvis演算子は三項演算子と似たように使われ、nullableな変数がnullを返すとき、nullの代わりに返す値を指定できる。
Elvis演算子は右へ90度回転して見ると、疑問符(?)が髪、コロン(:)が目のように見える。この形がElvisに似ていることから名付けられた。
ラムダ、関数、条件演算子
args -> expr // ラムダ式
type1 -> type2 // 関数の型定義
cond -> stmt // when式の条件処理
その他の演算子
::func // 関数参照
@annotation // アノテーション
label@ // ラベル
演算子の優先順位(Operator precedence)
演算子ごとに実行される順序がある。演算子が複数ある場合は、優先順位に従って順序が決まる。
| 優先順位 | 名称 | 演算子 |
|---|---|---|
| Highest | Postfix | ++(後置), --(後置), ., ?., ? |
| 2 | Prefix | -, +, ++(前置), --(前置), !, label |
| 3 | Type RHS | :, as, as?(型を変えるときに使う演算子) |
| 4 | Multiplicative | *, /, % |
| 5 | Additive | +, - |
| 6 | Range | ..(範囲を表す演算子) |
| 7 | Infix function | simpleIdentifier |
| 8 | Elvis | ?: |
| 9 | Named checks | in, !in, is, !is(範囲と型チェックに使用) |
| 10 | Comparison | <, >, <=, >= |
| 11 | Equality | ==, !=, ===, !== |
| 12 | Conjunction | && |
| 13 | Disjunction | ` |
| 14 | Spread operator | * |
| Lowest | Assignment | =, +=, -=, *=, /=, %= |