?
and ?:
如果在座各位程式高手看到 ?
肯定會有種 if-else
short expression / one-line 寫法的既視感,沒錯,這裡就讓後面流程控制 (Control flow) 章節才會出現的 if-else
先出來接個課,如果跟這東西不熟的讀者也可以看到後面再往前補這邊的進度。
讓我們直接看一個混亂至極的案例,原本的寫法如此的易懂,如果 dayOfIronMan
不為 null
則 dayOfIronMan
加一:
var dayOfIronMan: Int? = 4
if (dayOfIronMan != null) {
dayOfIronMan = dayOfIronMan.inc()
} else {
dayOfIronMan = 0
}
首先我們把 Nullable 跟 if-else
結合成 dayOfIronMan?
就可以讓只有非 null 才執行後面的 inc()
var dayOfIronMan: Int? = 4
dayOfIronMan = dayOfIronMan?.inc()
接著我們來處理後面的 else
,利用 ?:
我們可以把 else
的行為接在後面,如此就可以完成 1 行換 5 行的成果了 ( LOC 大幅降低中(X )
dayOfIronMan = dayOfIronMan?.inc() ?: 0
在看完 ?
後你可能會想,那如果我一定要他執行後面的行為呢?這時候你有 !!
(這不是震驚),在這種情況下,Kotlin 會幫你在 null
的時候噴錯,就會跟你想要對 null
進行運算依樣拿到nullPointerException
。
val len = s!!.length // throws NullPointerException if s is null
下面這些常用於輸出 (不論是 logging 或是 stdout) 的時候用來編排文字顯示方式。
\t
: 製表鍵,同鍵盤上 Tab
按鍵\n
: 換行顯示\'
: 單引號\"
: 雙引號\\
: 反斜線
val dayOfIronManCompetition = 5
val totalDayOfIronManCompetition = 30
"今天是鐵人賽第 $dayOfIronManCompetition 天," + "總共需要完成 $totalDayOfIronManCompetition 天"
// 今天是鐵人賽第 5 天,總共需要完成 30 天
"扣掉今天還需要 ${totalDayOfIronManCompet - dayOfIronManCompetition} 天"
// 扣掉今天還需要 25 天
// {} 可以放入各式運算式.