? 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 天
// {} 可以放入各式運算式.