Kotlin入門筆記三:可空類型

kotlin.jpeg

這次文章給大家介紹下Kotlin中的可空類型,說起可空這個問題,那就不得不提空指針異常啦,大家在開發中肯定被空指針折磨的不要不要的。筆者在實習期間可是被空指針困擾了很長時間,動不動APP就Crash掉了,打開Log一看,java.lang.NullPointerException就出現在眼前,接著就開始了漫長的非空判斷。

但是在kotlin中,這種現象得到了很好的控制,kotlin引入了可空類型,給開發者帶來了完美的解決方案,下面就來學習學習一下kotlin中可空類型。

1.可空類型的變量

kotlin中可以直接將一個變量聲明為可空類型,允許它為空,并且加入了很多的運算符,我們來一一學習:

首先我們來看看java中常規的判斷一個字符串是否為空的寫法:

 public static void main(String[] args) {
 checkStringNull("");
 }
?
 private static String checkStringNull(String string) {
 return string == null ? "null" : string;
 }
}
// 輸出:null</pre>

再來對比下kotlin對可空變量的處理

 var string: String?
 string = null;
 println(checkStringNull(string))
}
?
fun checkStringNull(string: String?): String? {
 return string
}
// 輸出:null</pre>

這里我們首先看到函數傳了一個String類型的參數,并且String后面多了一個,這就是kotlin的可空類型的聲明,它無需再像java那樣判斷是否為空,kotlin這種是允許為空,在聲明過后,這個變量就默認存儲了一個null引用,如果這個變量為空的話,就會取出這個null引用。如果沒有修飾的變量是默認不可為空的。

2.安全調用運算符:"?."

上面我們知道了如何聲明一個可空類型的變量,接著我們來看看如何運用這個可空變量:

我們通過一個例子來欣賞下安全調用運算符的強大之處:java版和kotlin版的小寫轉大寫

java:

 public static void main(String[] args) {
 String string = null;
 stringToUpperCase(string);
 }
?
 private static String stringToUpperCase(String string) {
 return string.toUpperCase();
 }
}
輸出結果
// AAA
// Exception in thread "main" java.lang.NullPointerException
// at MyNull.stringToUpperCase(MyNull.java:10)
// at MyNull.main(MyNull.java:6)

很明顯,在stringToUpperCase方法中沒有對string進行非空判斷,導致NullPointerException的異常拋出。

kotlin:

 val string: String? = "aaa"
 val nullString: String? = null
 println(stringToUpperCase(string))
 println(stringToUpperCase(nullString))
}
?
fun stringToUpperCase(string: String?): String? {
 return string?.toUpperCase()
}
輸出結果:
// AAA
// null

kotlin卻沒有拋出異常,而是返回了null,是不是很驚訝kotlin的強大,讓我們來看看kotlin的安全運算符是如何處理的:

安全運算符只會調用非空值的方法

只有當String不為空時,才會調用toUpperCase方法,String為空的時候,直接返回了null,這下媽媽再也不怕我們忘記處理空指針的情況了,哈哈~~

3.Elvis運算符:"?:"

在日常開發中我們也許會遇到這么一個需求:如果接口返回的數據為空,顯示為“--”。這就得對數據為空的情況額外處理了,我們還是對比java和kotlin的做法:

java

 public static void main(String[] args) {
 String string = "aaa";
 String nullString = null;
 System.out.println(checkStringNull(string));
 System.out.println(checkStringNull(nullString));
 }
?
 private static String checkStringNull(String string) {
 return string  ==  null  ?  "--" : string;
 }
}
?
輸出結果:
// aaa
// --

java中我們可以使用三元運算符來判斷是否為空,然后處理,這算是比較簡潔的寫法了,再來看看kotlin是否更簡單。

kotlin

 val string: String? = "aaa"
 val nullString: String? = null
 println(checkStringNull(string))
 println(checkStringNull(nullString))
}
?
fun checkStringNull(string: String?): String? {
 return string ?: "--"
}
輸出結果:
// aaa
// --

對比之下,kotlin代碼貌似更簡單了呢,同時也出現了新的運算符,它就是:"?:" Elvis運算符,用來替代null這種默認值的情況。

Elvis運算符用bar來代替null

結合著這張圖,我們來看看"?:"是如何處理的,bar是用來代替默認值null的,如果foo==null,那么就直接返回bar,和java中string == null ? "--" : string;三元運算符作用類似。

4.非空斷言:"!!"

kotlin還提供了一個運算符,如果你確定你的變量不可能為空,那么就可以使用!!來修飾你的變量,這種情況下,如果你的變量出現了null的情況,就會拋出空指針異常,我們來通過代碼感受下:

fun main(args: Array<String>) {
    val string: String? = "aaa"
    val nullString: String? = null
    println(sureNotNull(string))
    println(sureNotNull(nullString))
}

fun sureNotNull(string: String?): String? {
    return string!!
}
輸出結果:
// Exception in thread "main" aaa
// kotlin.KotlinNullPointerException
//  at MyNullKt.sureNotNull(MyNull.kt:9)
//  at MyNullKt.main(MyNull.kt:5)

非空斷言要謹慎使用哦,別斷著斷著你的程序就crash掉了...

這期就給大家帶來這么多,看完是不是覺得kotlin對開發者友好多了,有了可空類型的變量,我們就不必對接口返回的數據一一進行非空判斷了。下期筆者將為大家介紹下kotlin中的集合。


寫在最后

每個人不是天生就強大,你若不努力,如何證明自己,加油!

Thank You!

--Taonce

如果你覺得這篇文章對你有所幫助,那么就動動小手指,長按下方的二維碼,關注一波吧~~

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。