日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

kotlin 练习

發(fā)布時間:2023/11/27 生活经验 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 kotlin 练习 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

kotlin基礎(chǔ)語法

? samychen? 2017.05.28 17:07*?字?jǐn)?shù) 1224?閱讀 2434評論 0

每種編程語言都有一定的語法、語義和執(zhí)行順序(同步),學(xué)習(xí)一種新語言也都是從這三者出發(fā),下面我們就只針對kotlin的語法來做簡單的介紹。

Kotlin有自己的特性不該被Java的思維所束縛。

  1. 基本語法準(zhǔn)則:
    在Kotlin中常量用 val 聲明,變量用 var 聲明;
    關(guān)鍵字在前面,類型以冒號 :隔開在后面,也可以省略直接賦值;
    類型后帶問號 ? 表示可為空類型(默認(rèn)空類型安全);
    常量 val 延遲加載 by lazy{} ;
    默認(rèn)是線程安全的,關(guān)閉線程安全 lazy(LazyThreadSafetyMode.NONE){} ;
    變量 var 延遲加載 lateinit ;
    內(nèi)部類和參數(shù)默認(rèn)為public,而在Java中為private
    類默認(rèn)為不可繼承(final),想要可被繼承要聲明為 open 或 abstract
    取消了static關(guān)鍵字,靜態(tài)方法和參數(shù)統(tǒng)一寫在 companion object 塊
    internal模塊內(nèi)可見,inner內(nèi)部類
//常量數(shù)組int[][][] arrs = new int[3][2][1];
val arrs = Array(3) { Array(2) { IntArray(1) } }
internal var name: String? = null//類型后帶問號 ? 表示可為空類型(默認(rèn)空安全) internal var age: Int = 0//internal模塊內(nèi)可見,inner內(nèi)部類 //當(dāng)我們只有單個構(gòu)造器時,我們需要在從父類繼承下來的構(gòu)造器中指定需要的參數(shù)。這是用來替換Java中的super調(diào)用的。 open class Animal(name: String) class Person(name: String, surname: String) : Animal(name) 

kotlin是空類型安全的,所有變量默認(rèn)為"not null",必須顯式在類型后添加?修飾符才可賦值為null。

var notNullArtist: Artist = null//編譯不通過,因為notNullArtist不能為null
var artist: Artist? = null//編譯通過 artist.print()//編譯不通過,因為artist可能為空 /** Kotlin進(jìn)行空判斷處理,有兩種處理方式: * 1. 拋出空異常,字段后加 !! * 2. 不做處理直接跳過,字段后加 ? */ artist?.print()//編譯通過,做了非空判斷,只有當(dāng)artist!=null時才調(diào)用print() artist!!.print()//這種用法只有在確認(rèn)artist不為null時才能調(diào)用,否則拋出空指針異常 val name = artist?.name?:"empty"//當(dāng)artist為null時可以指定一個默認(rèn)值 
  1. 條件語句
    if...else 正常使用,不過移除了 switch 用更強(qiáng)大的 when 替代,when子式可以是各種返回Boolean的表達(dá)式
val x = 7
when (x) {in 1..5 -> print("x is in the range")in validNumbers -> print("x is valid") !in 10..20 -> print("x is outside the range") else -> print("none of the above") } 

kotlin盡可能多的使用when

  1. 循環(huán)語句
    while 和 do...while 同Java并無區(qū)別, for 則有很大改變并多出了幾個變種
fun main(args: Array<String>) {var list = ArrayList<String>()add(list) list.forEachIndexed { i, s -> print(list[i]) print(s) } println() //如果沒有指定函數(shù)的返回值,它就會返回Unit,與Java中的void類似,但是Unit是一個真正的對象。當(dāng)然也可以指定任何其它的返回類型: list.forEachIndexed(object :(Int,String) -> Unit{ override fun invoke(i: Int, s: String) { print(list[i]) print(s) } }) } //遞增for (int i = 0; i < list.size(); i++) for (i in list.indices) { print(list[i]) } //遞增for (int i = 2; i < list.size(); i++) for (i in 2..list.size-1) { print(list[i]) } //遞減for (int i = list.size(); i >= 0; i--) for (i in list.size downTo 0) { print(list[i]) } //操作列表內(nèi)的對象 for (item in list) { print(item) } //加強(qiáng)版 for((i,item) in list.withIndex()){ print(list[i]) print(item) } //變種版 list.forEach { print(it) } list.forEachIndexed { i, s -> print(list[i]) print(s) } list.forEachIndexed(object :(Int,String) -> Unit{ override fun invoke(i: Int, s: String) { print(list[i]) print(s) } }) fun add(list:MutableList<String>) { for (i in 0..4) { list.add(i.toString() + "") } } 

冒號使用
??在Kotlin中冒號 : 用萬能來稱呼絕不為過。常量變量的類型聲明,函數(shù)的返回值,類的繼承都需要它

除此之外還有一個特別的地方也需要它,使用Java類的時候。Kotlin最終會還是編譯成Java字節(jié)碼,使用到Java類是必然的,在Kotlin語法如下
val intent = Intent(this, MainActivity::class.java)

指定上下文的@

除了冒號另一個重要符號 @ ,java代碼中經(jīng)常用到內(nèi)部類和匿名內(nèi)部類,有時我們不能確定this指代的上下文,Java可以使用XXX.this指代具體上下文,在kotlin中的做法是this@XXX

class User {inner class State{ fun getUser(): User{ //返回User return this@User } fun getState(): State{ //返回State return this@State } } } 

kotlin的特色

Java的 getter/setter 方法自動轉(zhuǎn)換成屬性,對應(yīng)到Kotlin屬性的調(diào)用

public class User { private String name; private String age; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } } 

對應(yīng)的kotlin

val user = User()
//賦值
user.name = "tutu"
user.age = "23"
//取值 val name = user.name val age = user.age class User { var name: String? = null var age: String? = null } 

有時 getter/setter 方法比較復(fù)雜,這就需要自定義 getter/setter 了,實(shí)現(xiàn)一個Java中常用的單例,這里只為了展示,單例在Kotlin有更簡單的方法實(shí)現(xiàn),只要在 package 級別創(chuàng)建一個 object 即可

class User {companion object {//靜態(tài)方法和參數(shù)統(tǒng)一寫在 companion object 塊 //volatile不保證原子操作,所以,很容易讀到臟數(shù)據(jù)。在兩個或者更多的線程訪問的成員變量上使用volatile @Volatile var instance: User? = null get() { if (field == null) { synchronized(User::class.java) { if (field == null) field = User() } } return field } } var name: String? = null var age: String? = null } 

自定義 getter/setter 重點(diǎn)在 field ,跟我們熟悉所Java的 this 指代當(dāng)前類一樣, field 指代當(dāng)前參數(shù),直接使用參數(shù)名 instance 代替不會報錯但單例就沒效果了

字符串問題

在Java中拼接字符串的代碼可讀性都很差,在Kotlin字符串拼接變得非常簡潔,只需用 $ 后面加上參數(shù)名,復(fù)雜的參數(shù)要加上 {}

 val pair = Pair(1, "one")val (num, name) = pairprintln("num = $num, name = $name")

輸出num = 1, name = one

Java8新特性lambda的支持

lambda需要一個函數(shù),但是又不想費(fèi)神去命名一個函數(shù)的場合下使用,也就是指匿名函數(shù)。使用功能接口,把接口名、方法名和參數(shù)類型省掉不寫再加個 -> 罷了。

使用Java開發(fā)Android時,處理監(jiān)聽回調(diào)是常見的事,kotlin可以直接編寫監(jiān)聽回調(diào)而不用再通過匿名對象傳遞onClick方法,這個特性被稱為Lambda表達(dá)式

view.setOnclickListener({Toast.makeText(this, "Hello World!", Toast.LENGTH_LONG).show()
})

擴(kuò)展函數(shù)

可以為任何已經(jīng)存在的類添加新函數(shù),相比傳統(tǒng)工具類,擴(kuò)展函數(shù)更具有可讀性。

//為Fragment添加擴(kuò)展函數(shù)
fun Fragment.toast(message: CharSequence, duration: Int = Toast.LENGTH_LONG){Toast.makeText(getActivity(), message, duration).show()
}

調(diào)用時直接調(diào)用fragment.toast("Hello World!")或fragment.toast("Hello World!", 2000)

Kotlin中的參數(shù)與Java中有些不同。如你所見,我們先寫參數(shù)的名字再寫它的類型。上面調(diào)用的第二個參數(shù)(length)指定了一個默認(rèn)值。這意味著你調(diào)用的時候可以傳入第二個值或者不傳,這樣可以避免你需要的重載函數(shù)。

函數(shù)式支持(lambda),函數(shù)是一級公民

集合操作

??list轉(zhuǎn)map(associateBy)

??場景:訂單列表轉(zhuǎn)換成以 id為key 的訂單map

val mainOrders = orderDao!!.queryUserOrder(param)
val orderMap = mainOrders.associateBy { it.id }.toMap()

??map的key或者value轉(zhuǎn)換

??假如一個map的key是String,需要轉(zhuǎn)換成Long;或者map的value是一個對象,要轉(zhuǎn)成另一個對象。按照標(biāo)準(zhǔn)Java寫法,可以要new一個新的map,然后循環(huán)老的map,在kotlin中,一行代碼搞定

val map = mutableMapOf(1 to 1, 2 to 2)
val newMap = map.mapKeys { "key_${it.key}" }.mapValues { "value_${it.value}" }
println(newMap)
//打印結(jié)果 {key_1=value_1, key_2=value_2}
val pair = Pair("ss","sg") val map = mapOf(pair) val map1=map.mapKeys { entry -> "${entry.value}!" } for((key,value) in map1){ println("map1:key=$key") println("map1:value=$value") } val map2 =map.mapKeys { (key, value) -> "$value" } for((key,value) in map2){ println("map2:key=$key") println("map2:value=$value") } val map3=map.mapValues { entry -> "${entry.value}!" } for((key,value) in map3){ println("map3:key=$key") println("map3:value=$value") } val map4=map.mapValues { (key, value) -> "$value" } for((key,value) in map4){ println("map4:key=$key") println("map4:value=$value") } 打印結(jié)果: map1:key=sg! map1:value=sg map2:key=sg map2:value=sg map3:key=ss map3:value=sg! map4:key=ss map4:value=sg 

參考文獻(xiàn)
??Kotlin for android Developers
??kotlin 腳本練習(xí)

轉(zhuǎn)載于:https://www.cnblogs.com/vana/p/10201277.html

總結(jié)

以上是生活随笔為你收集整理的kotlin 练习的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。