Kotlin中常見(jiàn)的符號(hào)詳解
前幾年的Google I/O大會(huì)上,Google正式宣布,Kotlin將會(huì)成為Android開(kāi)發(fā)的官方支持語(yǔ)言。除了Android外,Kotlin還可以完全作為服務(wù)端開(kāi)發(fā)的語(yǔ)言,比如在未來(lái)的Spring 5就將對(duì)Kotlin提供強(qiáng)大的支持。以及瀏覽器編程語(yǔ)言,與JS進(jìn)行交互。
Kotlin是一門(mén)靜態(tài)語(yǔ)言,支持多種平臺(tái),包括移動(dòng)端、服務(wù)端以及瀏覽器端,此外,Kotlin還是一門(mén)融合了面向?qū)ο笈c函數(shù)式編程的語(yǔ)言,支持泛型、安全的空判斷,并且Kotlin與Java可以做到完全的交互。
現(xiàn)在介紹Kotlin的文章已經(jīng)是鋪天蓋地,大部分都是從Kotlin的基本數(shù)據(jù)類(lèi)型介紹起,本文不想重復(fù)這樣的事情,這里從另一面來(lái)開(kāi)始,我們來(lái)看看Kotlin中的各種符號(hào)。

$符合和多行輸入符
println("itemB:$itemB")
//字符串模板
var userInfo = "name:${user.name}, age:$age"
//三引號(hào)的形式用來(lái)輸入多行文本
val str = """
one
two
"""
//等價(jià)于
val str = "one\ntwo"
三引號(hào)之間輸入的內(nèi)容將被原樣保留,之中的單號(hào)和雙引號(hào)不轉(zhuǎn)義,其中的不可見(jiàn)字符比如/n和/t都會(huì)被保留。
?問(wèn)號(hào)
表示這個(gè)對(duì)象可能為空
//在變量類(lèi)型后面加上問(wèn)號(hào),代表該變量是可空變量 var name: String? = "zhangsan"
/**
* 如果str不能轉(zhuǎn)為Int類(lèi)型,則返回null
*/
fun parseInt(str: String): Int? {
// (代碼略)
}
b?.length //如果 b非空,就返回 b.length ,否則返回 null,這個(gè)表達(dá)式的類(lèi)型是 Int? 。
Elvis操作符(?:)
如果r非空,我使用它;否則使⽤某個(gè)非空的值 x ”:
val l: Int = if (b != null) b.length else -1
除了完整的 if-表達(dá)式,這還可以通過(guò) Elvis 操作符表達(dá):
val l = b?.length ?: -1
如果 ?: 左側(cè)表達(dá)式非空,elvis操作符就返回其左側(cè)表達(dá)式,否則返回右側(cè)表達(dá)式。請(qǐng)注意,當(dāng)且僅當(dāng)左側(cè)為空時(shí),才會(huì)對(duì)右側(cè)表達(dá)式求值。
!! 操作符
對(duì)于NPE 愛(ài)好者,我們可以寫(xiě) b!! ,這會(huì)返回一個(gè)非空的 b 值 或者如果 b 為空,就會(huì)拋出一個(gè) NPE 異常:
val l = b!!.length
因此,如果你想要一個(gè) NPE,你可以得到它,但是你必須顯式要求它,否則它不會(huì)不期而至。
==號(hào)與===號(hào)
==判斷值是否相等,===判斷值及引用是否完全相等。
val num: Int = 128; val a:Int? = num val b:Int? = num println(a == b) print(a === b)
..符號(hào)
Kotlin中有區(qū)間的概念,區(qū)間表達(dá)式由具有操作符形式 .. 的 rangeTo 函數(shù)輔以 in 和 !in 形成。 區(qū)間是為任何可比較類(lèi)型定義的,但對(duì)于整型原生類(lèi)型,它有一個(gè)優(yōu)化的實(shí)現(xiàn)。以下是使用區(qū)間的一些示例:
if (i in 1..10) { // 等同于 1 <= i && i <= 10
println(i)
}
//使用until函數(shù),創(chuàng)建一個(gè)不包括其結(jié)束元素的區(qū)間
for (i in 1 until 10) { // i in [1, 10) 排除了 10
println(i)
}
for (i in 1..4) print(i) // 輸出“1234”
for (i in 4..1) print(i) // 什么都不輸出
如果你想倒序迭代數(shù)字呢?也很簡(jiǎn)單。你可以使用標(biāo)準(zhǔn)庫(kù)中定義的 downTo() 函數(shù)
for (i in 4 downTo 1) print(i) // 輸出“4321”
step()函數(shù),可以指定任意步長(zhǎng)
for (i in 1..4 step 2) print(i) // 輸出“13” for (i in 4 downTo 1 step 2) print(i) // 輸出“42”
_(下劃線)
data class Book(var id: Int, var name: String)
上面的示例中,Book聲明了 id,name兩個(gè)變量。解構(gòu)時(shí)如果只需要id這一個(gè)變量時(shí),可以這么做:
val book = Book(1, "英語(yǔ)") val (id, _) = book
::符號(hào)
//得到類(lèi)的Class對(duì)象
startActivity(Intent(this@KotlinActivity, MainActivity::class.java))
//內(nèi)聯(lián)函數(shù)和reified后續(xù)介紹
inline fun <reified T> Gson.fromJson(json:String):T
{
return fromJson(json, T::class.java)
}
方法引用
var setBook = setOf<String>("hello", "hi", "你好")
// setBook.forEach { print(it)}
setBook.forEach(::print)
@符號(hào)
1、限定this的類(lèi)型
class User {
inner class State{
fun getUser(): User{
//返回User
return this@User
}
fun getState(): State{
//返回State
return this@State
}
}
}
2、作為標(biāo)簽
跳出雙層for
loop@ for (itemA in arraysA) {
var i : Int = 0
for (itemB in arraysB) {
i++
if (itemB > 2) {
break@loop
}
println("itemB:$itemB")
}
}
命名函數(shù)自動(dòng)定義標(biāo)簽:
fun fun_run(){
run {
println("lambda")
}
var i: Int = run {
return@run 1
}
println("$i")
//匿名函數(shù)可以通過(guò)自定義標(biāo)簽進(jìn)行跳轉(zhuǎn)和返回
i = run (outer@{
return@outer 2
})
println(i)
}
從forEach函數(shù)跳出
fun forEach_label(ints: List<Int>)
{
var i =2
ints.forEach {
//forEach中無(wú)法使用continue和break;
// if (it == 0) continue //編譯錯(cuò)誤
// if (it == 2) /*break //編譯錯(cuò)誤 */
print(it)
}
run outer@{
ints.forEach {
if (it == 0) return@forEach //相當(dāng)于在forEach函數(shù)中continue,實(shí)際上是從匿名函數(shù)返回
if (it == 2) return@outer //相當(dāng)于在forEach函數(shù)中使用break,實(shí)際上是跳轉(zhuǎn)到outer之外
}
}
if (i == 3)
{
//每個(gè)函數(shù)的名字代表一個(gè)函數(shù)地址,所以函數(shù)自動(dòng)成為標(biāo)簽
return@forEach_label //等同于return
}
}
{}符號(hào)
這里指的是lambda表達(dá)式的符號(hào)。
// 一個(gè)參數(shù)
var callback: ((str: String) -> Unit)? = null
callback = { println(it)}
// 判斷并使用
callback?.invoke("hello")
//兩個(gè)參數(shù)
var callback2: ((name: String, age: Int) -> Unit)? = null
callback2 = { hello: String, world: Int -> println("$hello's age is $world") }
callback2?.invoke("Tom", 22)
var callback3 :((num1:Int, num2: Int)->String)? = null
//類(lèi)型可以推斷
callback3 = { num1, num2 ->
var res:Int = num1 + num2
res.toString()
}
println(callback3?.invoke(1, 2))
kotlin中{}里面整個(gè)是lambda的一個(gè)表達(dá)式,而java8中{}部分只是lambda表達(dá)式的body部分。
還要 :符號(hào),用于類(lèi)名后表示繼承,用于變量后限定變量類(lèi)型,是Kotlin中最常用的符號(hào),這里基本囊括了Koltin中一些常見(jiàn)的符號(hào),關(guān)于符號(hào)就介紹這么多,如有遺漏請(qǐng)?jiān)傧路搅粞蕴岢?,我將補(bǔ)充上。
以上這篇Kotlin中常見(jiàn)的符號(hào)詳解就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Android如何實(shí)現(xiàn)設(shè)備的異顯功能詳解
這篇文章主要給大家介紹了關(guān)于Android如何實(shí)現(xiàn)設(shè)備的異顯功能的相關(guān)資料,這篇文章通過(guò)示例代碼介紹的非常詳細(xì),對(duì)各位Android開(kāi)發(fā)者們具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2022-02-02
Flutter Reusable Lottie Animations技巧
這篇文章主要為大家介紹了Flutter Reusable Lottie Animations技巧,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12
Android開(kāi)發(fā)實(shí)現(xiàn)的Log統(tǒng)一管理類(lèi)
這篇文章主要介紹了Android開(kāi)發(fā)實(shí)現(xiàn)的Log統(tǒng)一管理類(lèi),涉及Android日志管理及方法重載等相關(guān)操作技巧,需要的朋友可以參考下2017-12-12
詳解Android 硬布局item的高級(jí)寫(xiě)法
這篇文章主要介紹了詳解Android 硬布局item的高級(jí)寫(xiě)法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
Android實(shí)現(xiàn)ListView分頁(yè)加載數(shù)據(jù)
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)ListView分頁(yè)加載數(shù)據(jù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11
android之json數(shù)據(jù)過(guò)長(zhǎng)打印不全問(wèn)題的解決
這篇文章主要介紹了android之json數(shù)據(jù)過(guò)長(zhǎng)打印不全問(wèn)題的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04
android在異步任務(wù)中關(guān)閉Cursor的代碼方法
android在異步任務(wù)中如何關(guān)閉Cursor?在我們開(kāi)發(fā)應(yīng)用的時(shí)候,很多時(shí)候會(huì)遇到這種問(wèn)題,下面我們就看看代碼如何實(shí)現(xiàn)2013-11-11

