kotlin的語法和java有一定的差別,在使用的時候有一些語法還是容易不適應,所以記錄下來一些經常會用到的kotlin語法並帶有註釋和說明,方便更多人也方便自己在忘記時來查閱和使用~
1.關於創建對象
val a: Int = 100
println(a === a) // true,值相等,對象地址相等
//經過了裝箱,創建了兩個不同的對象
val boxedA: Int? = a
val anotherBoxedA: Int? = a
//雖然經過了裝箱,但是值是相等的,都是100
println(boxedA === anotherBoxedA) // true,值相等,128 之前對象地址一樣
println(boxedA == anotherBoxedA) // true,值相等
這裏把 a 的值換成 100,這裏應該原理跟 Java 中是一樣的,在範圍是 [-128, 127]之間並不會創建新的對象,比較輸出的都是 true,從 128 開始,比較的結果才爲false。
如果這裏a的值超過了127,則兩個對象值是相等的,但是對象的地址是不同的。
關於創建對象的優化:我們都知道java裏面對new關鍵字的引用比較謹慎,爲了避免內存消耗,儘量少使用new爲優化原則,特別是儘量避免在循環中創建對象,這個應該在kotlin中也同樣適用!
2.關於!!與?修飾變量的區別描述:
var a:String? = null
a!!.print() //a爲空時停止執行,做短路操作,項目運行中會出現空指針崩潰
a?.print() //a爲空時繼續執行,但會拋出異常,但項目並不會報空指針而崩潰直接,是比較安全的一種用法
當我們直接調用一個可空變量的某方法或某成員變量時:
Android Studio會提示在一個可空變量上,只有"安全調用"(safe call (?.))和"不爲空的斷言調用"(non-null assert call(!!.))是被允許的,
可以得知"!!"相當於是短路操作,即:
//kotlin中的
a!!.print()
// 相當於java中的
if(a==null){
throw new NullPointerException()
}
而"?"相當於是安全類型的捕獲或者拋出異常操作,即:
//kotlin中的
a?.print()
// 相當於java中的
if(a!=null){
a.print()
}
3.java中 extends kotlin用 (冐號):代替。
例如:java中:MainActivity extends Activity,
kotlin中:MaiActivity :Activity()
4.java中沒能返回值是void,返回值寫在小括號左面
現在改成空方法是Unit,方法用fun1, fun2,代替, 並且返回值要寫在小括號後面
fun Unit(x: Any, y: Any) {
funUnit(x: Any, y: Any): Int{
5.關於 switch case
java中 switch():
switch(){
case:
breaak;
}
kotlin 中改變爲 when() ->
fun main(args: Array) {
val language = if (args.size == 0) "EN" else args[0]
println(when (language) {
"python" -> "python!"
"java" -> "java!"
"kotlin" -> "you are a luckey dog!!!"
else -> "Sorry, I can't understand you in $language yet"
})
}
6.關於kotlin中的apply方法:
apply函數是這樣的,調用某對象的apply函數,在函數範圍內,可以任意調用該對象的任意方法,並返回該對象
代碼示例
fun testApply() {
// fun <T> T.apply(f: T.() -> Unit): T { f(); return this }
ArrayList<String>().apply {
add("testApply1")
add("testApply2")
add("testApply3")
println("this = " + this)
}.let { println(it) }
}
// 運行結果
// this = [testApply1, testApply2, testApply3]
// [testApply1, testApply2, testApply3]
7.關於for循環
//可以這樣寫
var isSubs = false
for (i in 0 until myList.size) {
val sku = ownedSkus[i]
Log.d(TAG,"sku =="+sku .toString())
if (sku=="sub_monthly"){
isSubs = true
//如果滿足條件,直接return結束循環
return isSubs
}
}
//也可以這樣的方式寫
for (i in 0..99) {
print(i.toString())
}
8.activity跳轉的時候,intent寫法:
//寫法一
var intent = Intent(this,YourActivity().javaClass)
//寫法二
var intent = Intent(this,YourActivity::class.java)
//最後放到 startActivity()方法裏面就行
startActivity(Intent(intent))
9.一個類中的變量想實現java中共的pulic static修飾效果,直接用類名可以調用
//在 var 修飾符前加 open就行
open var zodiacZodiacDataMap: MutableMap<String, CompatibilityZodiacData>? = null
10.一個類中的方法與變量如果想實現java中的pulic static修飾效果,別的類可以直接用類名.調用出來可以這樣寫:
函數:
//在方法函數修飾符前加 open 並且放到 companion object {}中就行
companion object {
open fun shareMore(activity: Activity){
val textIntent = Intent(Intent.ACTION_SEND)
activity!!.startActivity(Intent.createChooser(textIntent, "Share"))
}
}
//調用時就可以直接用類名調用
SharerUtil.shareMore(this)
變量:
//如果想要一個變量對外以靜態的形式開放,使其可以直接通過類名調用出來,可以這樣寫
class MainActivity : AppCompatActivity() {
companion object {
open var webview22: WebView? = null
}
}
//調用的時候這樣調用:
MainActivity.Companion.getWebview22().loadUrl("http:baidu.com")
11.在kotlin中一些容器的創建方式:
//int數組
var inArray= intArrayOf(20, 19, 21, 21, 21, 22, 23, 23, 23, 23, 22, 22)
//字符串 數組
var strArray = arrayOf("ss", "ss", "ss", "ss", "ss")
//字符串 map
var myDataMap: MutableMap<String, MyData>? = mutableMapOf<String,MyData>()
//字符串list
var strList = listOf( "ss", "ss", "ss", "ss", "ss")
//創建一個不可變的list
val mList = listOf<Int>(1, 2, 3)
//創建一個可變的list
val mList = mutableListOf<Int>(1, 2, 3)
//這裏mutableListOf初始化了三個值,如果沒有這三個值就相當於一個空集合,比如
val mList = mutableListOf<Int>()
12.kotlin中生成指定範圍隨機數的方法:
// 生成從0到2範圍內的隨機數(注意不包括2,實際生成的只有0和1)
var radomnum = Random().nextInt(2)
最後聲明:以上是我個人一些經驗的總結與歸納,如果有寫的不對的地方,歡迎留言指正,謝謝!