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 =, +=, -=, *=, /=, %=

参考