kotlin官方文檔-1.0入門

什么是Kotlin碍讨?

圖片發(fā)自簡書App

Kotlin是JetBrains開發(fā)的基于JVM的語言琴许,JetBrains想必大家應(yīng)該很熟悉了益兄,他們創(chuàng)造了很多強(qiáng)大的IDE疑枯,android studio谷歌官方的android IDE就是基于Intellij,kotlin可以作為一個插件被用來開發(fā)android跟java比kotlin有什么好處?

1.它更容易表現(xiàn),使用kotlin你可以少寫很多代碼,比如創(chuàng)建數(shù)據(jù)類等。

2.它更安全,在用Java開發(fā)時嗅绸,大多數(shù)代碼都是預(yù)防性的羹铅。為了不遇到非預(yù)期的NullPointerException,在使用之前,要不斷的檢測對象是否為空嚎尤。與許多其它語言一樣,因為需要使用安全調(diào)用運(yùn)算符顯式指明對象是否能夠為空(null)乏梁,所以Kotlin是空類型安全的

3.它是函數(shù)式的次洼,Kotlin是基于面向?qū)ο蟮恼Z言。但是就如其他很多現(xiàn)代的語言那樣遇骑,它使用了很多函數(shù)式編程的概念滓玖,比如,使用lambda表達(dá)式來更方便地解決問題质蕉。其中一個很棒的特性就是Collections的處理方式势篡。

4.它可以擴(kuò)展函數(shù),這意味著我們可以擴(kuò)展類的更多的特性模暗,甚至我們沒有權(quán)限去訪問這個類

kotlin官方文檔傳送門:https://kotlinlang.org/docs/reference/basic-syntax.html

1.入門

1.1 基本語法

1.1.1 定義包

包說明應(yīng)該在源文件的頂部:

package my.demo

import java.util.*

// ...

*不要求包與目錄匹配:源文件可以在系統(tǒng)中的任意地方禁悠。

1.12 定義函數(shù)

函數(shù)帶有兩個int類型參數(shù),并且返回int類型值:

fun sum(a: Int, b: Int): Int {

return a + b

}

函數(shù)體可以是個表達(dá)式兑宇,并可以從中推斷出返回值類型:

fun sum(a: Int, b: Int) = a + b

函數(shù)也可以返回?zé)o意義的值:

fun printSum(a: Int, b: Int): Unit {

print(a + b)

}

Unit返回值類型可以省略:

fun printSum(a: Int, b: Int) {

print(a + b)

}

1.1.3 定義局部變量

一次賦值(只讀)局部變量:

val a: Int = 1

val b = 1 //? 推斷為Int類型

val c: Int? // 如果沒有初始化就要求說明類型

c = 1 // 明確賦值

可變變量:

var x = 5 // 推斷為Int類型

x += 1

提示

就像 Java 和 JavaScript, Kotlin 支持以下兩種代碼注釋方式:

// This is an end-of-line comment

/* This is a block comment on multiple lines. */

1.1.4 使用字符串模板

fun main(args: Array) {

if (args.size == 0) return

print("First argument: ${args[0]}")}

1.1.5 使用條件表達(dá)式

fun max(a: Int, b: Int): Int {

if (a > b)

return a

else

return b

}

使用if表達(dá)式:

fun max(a: Int, b: Int) = if (a > b) a else b

1.1.6使用nullable值檢測空(null)值

當(dāng)空值可能出現(xiàn)時碍侦,引用必須明確標(biāo)記出可null值。

如果str沒有保存一個整數(shù)隶糕,則返回null:

fun parseInt(str: String): Int? {

// ...

}

用函數(shù)返回可null值:

fun main(args: Array) {

if (args.size < 2) {

print("Two integers expected")

return

}

val x = parseInt(args[0])

val y = parseInt(args[1])

//? 由于x瓷产,y是null,所以使用x*y將產(chǎn)生錯誤枚驻。

if (x != null && y != null) {

// 在null檢查后濒旦,x和y自動地配置(cast)到非可空

print(x * y)

}

}

// ...

if (x == null) {

print("Wrong number format in '${args[0]}'")

return

}

if (y == null) {

print("Wrong number format in '${args[1]}'")

return

}

// 在空檢查后,x和y自動的匹配到非可null

print(x * y)

1.1.7? 使用類型檢查和自動類型轉(zhuǎn)換

is操作符檢查表達(dá)式是否類型實例再登。如果對不可變局部的變量或?qū)傩赃M(jìn)行特定類型檢查了尔邓,就不需要明確的類型轉(zhuǎn)換。

fun getStringLength(obj: Any): Int? {

if (obj is String) {

// 在這個分支中锉矢,`obj`自動轉(zhuǎn)換到`String`

return obj.length

}

// 在類型檢查分支之外梯嗽,`obj`仍然是`Any`類型

return null

}

fun getStringLength(obj: Any): Int? {

if (obj !is String)

return null

// 在這個分支上,`obj`自動轉(zhuǎn)換到`String`

return obj.length

}

甚至

fun getStringLength(obj: Any): Int? {

// 在`&&`右手邊條件成立時沽损,`obj`自動轉(zhuǎn)換到`String`

if (obj is String && obj.length > 0)

return obj.length

return null

}

1.1.8 使用for循環(huán)

fun main(args: Array) {

for (arg in args)

print(arg)

}

for (i in args.indices)

print(args[i])

1.1.9 使用while循環(huán)

fun main(args: Array) {

var i = 0

while (i < args.size)

print(args[i++])

}

1.1.10 使用when表達(dá)式

fun cases(obj: Any) {

when (obj) {

1? ? ? ? ? ? ? ? -> print("One")

"Hello"? ? ? ? -> print("Greeting")

is Long? ? ? -> print("Long")

!is String? ? -> print("Not a string")

else? ? ? ? ? ? -> print("Unknown")

}

}

1.1.11 使用范圍

使用in操作符檢查一個數(shù)字是否在一個范圍內(nèi):

if (x in 1..y-1)

print("OK")

檢查一個數(shù)字是否超出范圍:

if (x !in 0..array.lastIndex)

print("Out")

遍歷整個范圍:

for (x in 1..5)

print(x)

1.1.12 使用集合

遍歷一個集合:

for (name in names)

println(name)

使用in操作符檢查一個集合是否包含一個對象:

if (text in names) // 調(diào)用names.contains(text)

print("Yes")

使用Lambda表達(dá)式過濾和映射集合:

names

.filter { it.startsWith("A") }

.sortedBy { it }

.map { it.toUpperCase() }

.forEach { print(it) }

1.2 習(xí)慣用語

這里隨機(jī)收集了一些經(jīng)常在Kotlin中使用的習(xí)慣用語灯节,如果你有喜歡的,也可以貢獻(xiàn)出來绵估,和我們的合并炎疆。

1.21 創(chuàng)建DTO(POJO/POCO)

data class Customer(val name: String, val email: String)

提供帶有下列功能的Customer類:

-所有屬性的getter(和var的setter)

-equals()

-hashCode()

-toString()

-copy()

-component1(),component2()

1.2.2 函數(shù)參數(shù)的默認(rèn)值

fun foo(a: Int = 0, b: String = "") { ... }

1.2.3 過濾列表

val positives = list.filter { x -> x > 0 }

或者更簡潔的寫法:

val positives = list.filter { it > 0 }

1.2.4 字符串插值

println("Name $name")

1.2.5 實例檢查

when (x) {

is Foo -> ...

is Bar -> ...

else -> ...}

1.2.6 遍歷鍵值對/列表對

for ((k, v) in map) {

println("$k -> $v")

}

k,v可以調(diào)用任何東西壹士。

1.2.7? 使用范圍

for (i in 1..100) { ... }

for (x in 2..10) { ... }

1.2.8 只讀列表

val list = listOf("a", "b", "c")

1.2.9 只讀映鍵值對

val map = mapOf("a" to 1, "b" to 2, "c" to 3)

1.2.10 訪問鍵值對

println(map["key"])

map["key"] = value

1.2.11 Lazy屬性

val p: String by lazy {

// 計算串

}

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

fun String.spaceToCamelCase() { ... }"

Convert this to camelcase".spaceToCamelCase()

1.2.13 創(chuàng)建單例模式

object Resource {

val name = "Name"

}

1.2.14 if非空簡寫

val files = File("Test").listFiles()

println(files?.size)

1.2.15 if非空和else簡寫

val files = File("Test").listFiles()

println(files?.size ?: "empty")

1.2.16 if空磷雇,執(zhí)行語句

val data = ...

val email = data["email"] ?: throw IllegalStateException("Email is missing!")

1.2.17 if非空偿警,執(zhí)行語句

val data = ...

data?.let {

... // 如果非空執(zhí)行這句代碼

}

1.2.18 when語句返回值

fun transform(color: String): Int {

return when (color) {

"Red" -> 0

"Green" -> 1

"Blue" -> 2

else -> throw IllegalArgumentException("Invalid color param value")

}

}

1.2.19 try/catch表達(dá)式

fun test() {

val result = try {

count()

} catch (e: ArithmeticException) {

throw IllegalStateException(e)

}

// 和result一起工作

}

1.2.20 if表達(dá)式

fun foo(param: Int) {

val result = if (param == 1) {

"one"

} else if (param == 2) {

"two"

} else {

"three"

}

}

1.2.21 返回Unit類型的方法生成器風(fēng)格用法

fun arrayOfMinusOnes(size: Int): IntArray {

return IntArray(size).apply {

fill(-1)? }

}

1.2.22? 單一表達(dá)式函數(shù)

fun theAnswer() = 42

等價于

fun theAnswer(): Int {

return 42

}

這也可以與其他習(xí)慣用語有效的組合在一起躏救,簡化代碼。如:與when表達(dá)式:

fun transform(color: String): Int = when (color) {

"Red" -> 0

"Green" -> 1

"Blue" -> 2

else -> throw IllegalArgumentException("Invalid color param value")

}

1.2.23 在對象實例中(‘with’)調(diào)用多方法

class Turtle {

fun penDown()

fun penUp()

fun turn(degrees: Double)

fun forward(pixels: Double)

}

val myTurtle = Turtle()

with(myTurtle) { //繪制100px正方形

penDown()

for(i in 1..4) {

forward(100.0)

turn(90.0)

}

penUp()

}

1.2.24 Java7的try與資源

val stream = Files.newInputStream(Paths.get("/some/file.txt"))

stream.buffered().reader().use { reader ->

println(reader.readText())

}

1.3? 編碼約定

這里是一些Kotlin開發(fā)語言的目前編碼風(fēng)格。

1.3.1 命名風(fēng)格

如有疑問盒使,默認(rèn)的是Java編碼約定崩掘,如:

——名稱用駝峰式拼寫法(并避免在名稱中用下劃線)

——以大寫字母開始

——方法和屬性名稱以小寫字母開始

——用4空格縮進(jìn)

—— public函數(shù)應(yīng)有文檔化,使其能在Kotlin文檔中顯示

1.3.2 冒號

在用冒號分隔類型和子類型時少办,冒號前需要添加一個空格苞慢;而在分隔實例與類型時,冒號前就不需要空格:

interface Foo : Bar {

fun foo(a: Int): T

}

1.3.3 Lambda表達(dá)式

在Lambda表達(dá)式中英妓,空格應(yīng)該用在花括號兩邊挽放,以及將參數(shù)與函數(shù)體分隔的箭頭兩側(cè)。如果可能蔓纠,Lambda表達(dá)式應(yīng)該在括號外傳遞辑畦。

list.filter { it > 10 }.map { element -> element * 2 }

在簡寫且沒有嵌套的Lambda表達(dá)式中,推薦用it約定替代顯式的參數(shù)申明腿倚。而在帶有參數(shù)的嵌套Lambda表達(dá)式中纯出,應(yīng)該總是顯式申明參數(shù)。

1.3.4 Unit

如果函數(shù)返回Unit類型敷燎,則返回類型應(yīng)該省略:

1 fun foo() {? // 這里省略了“: Unit”暂筝。

}

作者:Andrman

鏈接:http://www.reibang.com/p/b70011dfba7d

來源:簡書

著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán)硬贯,非商業(yè)轉(zhuǎn)載請注明出處焕襟。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市饭豹,隨后出現(xiàn)的幾起案子胧洒,更是在濱河造成了極大的恐慌,老刑警劉巖墨状,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件卫漫,死亡現(xiàn)場離奇詭異,居然都是意外死亡肾砂,警方通過查閱死者的電腦和手機(jī)列赎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來镐确,“玉大人包吝,你說我怎么就攤上這事≡春” “怎么了诗越?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長息堂。 經(jīng)常有香客問我嚷狞,道長块促,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任床未,我火速辦了婚禮竭翠,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘薇搁。我一直安慰自己斋扰,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布啃洋。 她就那樣靜靜地躺著传货,像睡著了一般。 火紅的嫁衣襯著肌膚如雪宏娄。 梳的紋絲不亂的頭發(fā)上损离,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天,我揣著相機(jī)與錄音绝编,去河邊找鬼僻澎。 笑死,一個胖子當(dāng)著我的面吹牛十饥,可吹牛的內(nèi)容都是我干的窟勃。 我是一名探鬼主播,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼逗堵,長吁一口氣:“原來是場噩夢啊……” “哼秉氧!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蜒秤,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤汁咏,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后作媚,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體攘滩,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年纸泡,在試婚紗的時候發(fā)現(xiàn)自己被綠了漂问。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡女揭,死狀恐怖蚤假,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情吧兔,我是刑警寧澤磷仰,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站境蔼,受9級特大地震影響灶平,放射性物質(zhì)發(fā)生泄漏伺通。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一民逼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧涮帘,春花似錦拼苍、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至弦叶,卻和暖如春俊犯,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背伤哺。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工燕侠, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人立莉。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓绢彤,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蜓耻。 傳聞我的和親對象是個殘疾皇子茫舶,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評論 2 354

推薦閱讀更多精彩內(nèi)容