Kotlin入門教程,快使用Kotlin吧

2021-02-13 豆豆聊IT
學習網站 Kotlin 從入門到放棄:https://www.jianshu.com/c/d3eac4c37b5fKotlin 菜鳥教程:http://www.runoob.com/kotlin/kotlin-tutorial.html基本語法 1、數據類型1.1、基本數據類型類型位寬度Double64Float32Long64Int32Short16Byte8

每一個類型都有一個toXXX方法,將該類型轉成其他類型。

1.2、Boolean

它有兩個值,true和false,運算方式和Java一樣有三種,||,&&,!

1.3、數組

數組用Array類實現,和Java不同的地方在於,Array類有一個size屬性表示數組長度,還有get和set方法,但是也可以使用array[position]的方式獲取

1.4、Char

Kotlin中的Char類型不能作為數字使用,如果需要的話需要使用toInt方法轉換。

1.5、字符串

字符串的用法和Java的差不多,這裡需要注意的一點是我們可以使用字符串模版,模版表達式以美元符號開頭,例如:

1val string= "i=$i"
2println(string)    

2、函數定義

函數定義必須使用fun關鍵字,參數格式為 參數: 類型,如果有返回值,那麼在函數的最後指明,例如:

1fun sum(a: Int, b: Int) :Int {
2    return a+b
3}

3、常量與變量var:

可變變量,可讀並且可寫

1var <標識符> : <類型> = <初始化值>
2

val:

不可變常量,只能賦值一次(類似Java中的final)

常量與變量都可以沒有初始化值,但是在引用前必須初始化4、NULL檢查機制

又名Kotlin的空安全,這是Kotlin獨有的,在對於聲明可空的參數,在使用時要進行判空處理,有兩種處理方式,欄位後面加上!!,這樣可以像Java那樣如果為空就報空指針異常,還有一種是欄位後加?,這樣可以不做處理返回null或者配合?:(相當於Java中的三元運算)做判空處理:

1
2var age: String? = "23" 
3
4val ages = age!!.toInt()
5
6val ages1 = age?.toInt()
7
8val ages2 = age?.toInt() ?: -1

5、條件判斷

if和else的使用同Java一樣,但是Java中的switch替換成了when,它既可以當作表達式使用,也可以當作語句使用:

1val x=1
2when(x){
3    1 -> print("x==1")    第一個條件
4    2 -> print("x==2")    第二個條件
5    ....
6    else -> {     //最終(相當於switch的default)
7        print("x==xxx")
8    }
9}
10
11或者還可以這樣用
12
13val y=1
14when(y){
15    1,2 -> print("y==1 || y==2")  //多個分支有相同的處理方式時可以用逗號隔開統一處理
16    else{
17        print("x==xxx")
18    }
19}

6、循環

while,do whie的使用方法和Java一樣,唯一變的是for循環:

1for (i in 1..5){
2    print(i)   
3}
4
5
6
7if (i in 1..5){
8    
9}
10if (i !in 1..5){
11    
12}
13
14for (i in 5 downTo 1){
15    print(i)  
16}
17
18
19for (i in 1..5 step 2){
20    print(i)  
21}
22
23
24for (i in 1 until 5){
25    print(i)  
26}
27

範型通配符 out:

在java中,有通配符和邊界的概念比如Class,表示上界通配符,它代表T以及T的子類,上限是T;在kotlin中可以使用out來替代例如clazz: Class<out T>

in:

同樣也有下屆通配符比如,它表示T以及T的超類,下限是T;在kotlin中可以使用in來代替例如clazz: Class<in T>

靜態類和靜態方法 object(全局):

使用object修飾的類,同時會創建一個實例(類似Java中的單例模式),可以直接通過 類名.方法名或者類名.屬性名來直接調用該類中的方法或者屬性。

1object TestUtil{
2    fun test(str:String){
3    }
4}

需要注意的是,如果在Java中調用的話需要先訪問該類靜態的INSTANCE,如TestUtil.INSTANCE.test()

companion object(部分):

在kotlin中,我們可以使用companion object{}來修飾方法:

1companion object {
2    fun start(context: Context) {
3        FRStartActivity.start(context, MainActivity::class.java)
4    }
5}

這樣這個方法就相當於java中的靜態方法,我們可以直接使用 類名.方法 名來進行調用。

構造方法

構造方法分為主構造方法和次構造方法,主構造方法只能有一個,次構造方法可以有多個:

1class Test(context: Context, flag: Int, string: String) {
2
3    constructor(context: Context, flag: Int) : this(context, flag, "")
4
5    constructor(context: Context, string: String) : this(context, 0, string)
6}

主構造函數在類頭中申明,而次構造函數在類體中申明;

主構造函數沒有任何修飾符時可以省略constructor關鍵字,而次構造函數不能省略;

主構造函數不能包含任何的代碼,而次構造函數可以;

主構造函數的參數可以在類體中的屬性初始化代碼和初始化塊中使用,而次構造函數的參數不能;

主構造函數中可以直接申明並初始化屬性,而次構造函數不能直接申明屬性;

如果申明了主構造函數,那麼所有的次構造函數都必需直接或間接地委託給主構造函數;

非抽象類中如果沒有聲明任何構造函數,會生成一個不帶參數的主構造函數,而不會生成任何次構造函數。

常見的操作符講解 1、: 操作符

1.1、聲明常量和變量的類型

1var count:Int=0
2val TAG:String="Main"

1.2、類的繼承

1
2
3class MainActivity : Activity(){
4}

1.3、使用Java類

1val intent=Intent(this,MainActivity::class.java)

2、? 操作符

?一般在某個對象或者方法後面添加,表示該對象或者方法可以為空。

1var name:String?=null
2
3fun name(str:String):Int?{
4}
5
6name?.length 

3、?: 操作符

該操作符也稱之為Elvis操作符,來看一下它的使用方法:

1val length = name?.length ?: -1 

如果?:左側表達式非空,那麼就會返回其左邊表達式的結果,否則返回右邊的。

4、!! 操作符

1val length=name!!.length

如果name為null,那麼會寶空指針異常,否則會返回name的長度,它與?的區別在於它不允許為空,為空就報空指針異常。

5、as 與 as? 操作符

這兩個操作符都是用來類型轉換的,但是前者可能會出現類型轉換出錯,然後會報ClassCastException異常,後者當出現類型轉換的錯誤時會返回null。

1private lateinit var textView : TextView
2private var imageView : ImageView? = null
3
4textView = findViewById(R.id.xxx) as TextView
5imageView = findViewById(R.id.xxx) as? ImageView

6、is 與 !is 操作符

這兩個個操作符的使用和Java中的instanceof一樣,用來判斷某個實例是否屬於某個類型

1if (textView is View){
2}
3if (imageView !is TextView){
4}

擴展函數

擴展函數數是指在一個類上增加一種新的行為,甚至我們沒有這個類代碼的訪問權限。換句話說,我們可以給某個類進行擴展,在不改變原來類的基礎上增加一些新的函數方便我們使用,比如:

1fun Context.toast(message: CharSequence, duration: Int = Toast.LENGTH_SHORT) {
2    Toast.makeText(this, message, duration).show()
3}
4
5fun String?.isEmpty() = this == null || length == 0

對於上述函數,Context和String是函數擴展的對象,也就是你要給誰增加函數;.表示擴展函數修飾符;toast和isEmpty為函數名。

內聯函數

Java的方法執行需要壓棧出棧,如果一個方法被多次調用,那麼就需要多次的壓棧出棧,為了節省這個操作,提高一定的效率,在kotlin中使用內聯函數來拷貝你調用的方法,然後在你當前方法中使用。

下面列舉kotlin中常用的幾個函數,用法可以參考:Kotlin中let、also、with、apply函數

1.1、let函數

let擴展函數的實際上是一個作用域函數,當你需要去定義一個變量在一個特定的作用域範圍內,let函數的是一個不錯的選擇;let函數另一個作用就是可以避免寫一些判斷null的操作。let函數是有返回值的,它的返回值為函數塊的最後一行或指定return表達式。

使用場景:需要去明確一個變量所處特定的作用域範圍內可以使用。

1@kotlin.internal.InlineOnly
2public inline fun <T, R> T.let(block: (T) -> R): R {
3    contract {
4        callsInPlace(block, InvocationKind.EXACTLY_ONCE)
5    }
6    return block(this)
7}

1.2、also函數

also函數和let基本一樣,不同的是also返回的是當前對象。

使用場景:和let一樣

1@kotlin.internal.InlineOnly
2@SinceKotlin("1.1")
3public inline fun <T> T.also(block: (T) -> Unit): T {
4    contract {
5        callsInPlace(block, InvocationKind.EXACTLY_ONCE)
6    }
7    block(this)
8    return this
9}

1.3、with函數

with函數與其他函數不同,他不是一個擴展函數,它是將某個對象作為函數的參數,在函數塊內可以通過 this 指代該對象。返回值為函數塊的最後一行或指定return表達式。

使用場景:適用於調用同一個類的多個方法時,可以省去類名重複,直接調用類的方法即可,經常用於Android中RecyclerView中onBinderViewHolder中,數據model的屬性映射到UI上。

1@kotlin.internal.InlineOnly
2public inline fun <T, R> with(receiver: T, block: T.() -> R): R {
3    contract {
4        callsInPlace(block, InvocationKind.EXACTLY_ONCE)
5    }
6    return receiver.block()
7}

1.4、run函數

run函數實際上可以說是let和with兩個函數的結合體,run函數隻接收一個lambda函數為參數,以閉包形式返回,返回值為最後一行的值或者指定的return的表達式。

使用場景:適用於let,with函數任何場景

1@kotlin.internal.InlineOnly
2public inline fun <T, R> T.run(block: T.() -> R): R {
3    contract {
4        callsInPlace(block, InvocationKind.EXACTLY_ONCE)
5    }
6    return block()
7}

1.5、apply函數

apply和run差不多,不同的是apply函數返回的是他傳入的對象

使用場景:apply一般用於一個對象實例初始化的時候,需要對對象中的屬性進行賦值。

1@kotlin.internal.InlineOnly
2public inline fun <T> T.apply(block: T.() -> Unit): T {
3    contract {
4        callsInPlace(block, InvocationKind.EXACTLY_ONCE)
5    }
6    block()
7    return this
8}

注意:上面這些函數它們還有一個共同的使用場景,就是可以用來判空


相關焦點

  • Kotlin 怎麼學 ?遇到過哪些坑?
    kotlin 官網教程英文 https://kotlinlang.org/docs/reference/basic-types.htmlkotlin 官網教程中文 https://www.kotlincn.net/docs/reference/閱讀此文章大約半小時~如何閱讀?
  • 使用 Kotlin 進行 Android 測試
    使用 Kotlin 進行 Android 測試事實上,這也不是一個新話題,因為 Kotlin 在程式語言世界裡攻城略地,尤其在 Android 中。為什麼要在測試中使用 Kotlin?我們有一個使用 Java 寫的 Android 代碼庫,我們想逐步引入這門帥氣的語言,所以為啥不從測試開始呢?這樣子我們就可以在任何環境下都不影響主應用的情況下放心地參試 Kotlin,體驗把這門現代接近成熟的語言帶來的激情,而且也可以為我們和我們的團隊做一些迎接大改變的準備。聽上去是不是很牛逼?那麼讓我們先寫些代碼...
  • Kotlin學習筆記——基礎篇
    1.基礎語法英文官網:https://kotlinlang.org/docs/reference/中文官網:https://www.kotlincn.net/docs/reference/協程學習資料:https://www.kotlincn.net/docs/reference/coroutines-overview.html
  • Kotlin 測試利器—MockK
    關鍵字  在 Kotlin 裡面 when是關鍵字,Mockito 的when ,必須加上反引號才能使用:`when`(xxxx).thenReturn(xxx)  如果看起來不舒服,也可以捨棄 Mockito 改用 mockito-kotlin
  • 最強總結 | 帶你快速搞定kotlin開發(上篇)
    val可以理解為Java中的屬性聲明加上了final關鍵字(將kotlin的字節碼反編譯成Java一看就知道了),其實kotlin是更傾向於推薦使用val來聲明變量,這是一種防禦性的編碼思維模式,目的是減少程序出錯或者變的更加安全。
  • 問:談談 Kotlin 範型與逆變協變?
    kotlin 系列文章均以 Java 差異為核心進行提煉,與 Java 相同部分不再列出。隨著 kotlin 官方版本的迭代,文中有些語法可能會發生變化,請務必留意。kotlin 泛型(generics)與 java 一樣,kotlin 的泛型用來表示變量類型的參數化。
  • Kotlin 一統天下?Kotlin/Native 支持 iOS 和 Web 開發
    官方表示協程已經完全準備好用於生產環境,他們也已使用協程進行開發,而且也沒發現在使用當中出現任何重大問題。之所以仍保持實驗性狀態,是為了能夠對 Kotlin 繼續進行設計迭代。根據目前的計劃,Kotlin 1.3 將會刪除協程的實驗性狀態。
  • Java到Kotlin,從入門到放棄
    Kotlin的編譯時安全性,簡潔明快,去掉Java繁瑣的臭裹腳布。是該切換到Kotlin呢?還是堅守Java繼續擼呢,這是每一個Java碼農需要思考的問題。那麼本文蟲蟲就給大家白一白。我最喜歡的一組JVM語言棧:主推Java,Groovy 做測試。去年夏天,我們團隊開始了一個新的微服務項目,和往常一樣,除了擼碼,我們也爭論語言和技術。
  • 新課程上線 | 學習使用 Kotlin 進行 Android 開發的最佳時機!
    為了與時俱進並迎接未來發展,現在正是學習使用 Kotlin 進行 Android 開發的絕佳時機。https://youtu.be/oSim9fBFy-E從頭開始學習編程可能讓您望而生畏,但技術背景並不是學習的必要條件。近期的 Stack Overflow 開發者調查結果顯示,近 40% 的專業開發者並非計算機科學或軟體工程專業科班出身。
  • Kotlin項目實戰之手機影音---悅單條目實現及BaseListFragment抽取
    悅單條目自定義及界面適配:闡述:距離上一次Kotlin項目實戰之手機影音---首頁mvp重構、網絡框架封裝、重構首頁數據加載、home頁面view解綁這塊的學習已經相隔快半年了
  • 一款純Kotlin編寫的開源安卓應用 "Smile"
    我並不是在炫耀我的自學能力,Smile 的內容並不算多,肯定有很多大牛比我快,我想表達的是這 9 天的學習及開發過程是刀過竹解、得心應手的。所以我想把這個學習過程分享給大家,只要能幫到一個人,那就是有價值的。
  • Kotlin函數式編程
    使用表達式,不用語句:函數式編程關心輸入和輸出,即參數和返回值。在程序中使用表達式可以有返回值,而語句沒有。例如控制結構中的 if 和 when 結構都屬於表達式。高階函數:函數式編程支持高階函數,所謂的高階函數就是一個函數可以作為另一個函數的參數或返回值。
  • 開源之Kotlin:如何通過AS用kotlin編程做簡單的安卓手機APP
    從今天起,我們開始以趣味小實例小應用的形式來接觸學習探討Android下的手機等移動端編程kotlin編程。需要說明的是,雖然這裡這裡說是Android,不過一人客的設想是,以kotlin編程和官方IDE(知名IDE)為工具,以手機或其他行動裝置為平臺,以應用為實現載體,大方向不變,但並不排除會根據現實情況或學習進度轉用其他OS比如國產OS鴻蒙等。
  • Kotlin協程優雅的與Retrofit纏綿
    作者:limuyang2,連結:https://juejin.im/post/5cfb38f96fb9a07eeb139a00Kotlin已經成為Android開發的Google第一推薦語言,項目中也已經使用了很長時間的kotlin了,加上Kotlin1.3的發布,kotlin協程也已經穩定了
  • 一些 Kotlin 小技巧及解析
    結合著 Kotlin 的高級函數的特性可以讓代碼可讀性更強,更加簡潔,但是呢簡潔的背後是有代價的,使用不當對性能可能會有損耗,這塊往往很容易被我們忽略,這就需要我們去研究 kotlin 語法糖背後的魔法,當我們在開發的時候,選擇合適的語法糖,儘量避免這些錯誤,關於 Kotlin 性能損失那些事,可以看一下我另外兩篇文章。
  • 使用Kotlin來開發Android,愛上它的優雅
    之前聽說了這個傳奇的語言,但是並沒有認真的去嘗試使用他用到開發中,現在已經成為官方語言了,學習是必須的了!首先看看他的一些特性吧,之前看了一些Swift語言的特點,就先拿Kotlin和Swift和Java的對比來看看他的優勢吧。
  • Kotlin 1.2.70 發布,增量編譯速度提高 7 倍
    需注意的是,增量編譯支持目前仍處於實驗階段,默認禁用,體驗前需手動啟用:在 Gradle 項目中,添加  kotlin.incremental.js=true到 gradle.properties或 local.properties在使用 IntelliJ IDEA 構建的項目中,轉到 Settings | Build, Execution, Deployment
  • 為數不多的人知道的 Kotlin 技巧及解析(一)
    .count()}println(time2) // 23641Sequences 和 Iterator 處理時間如下所示:SequencesIterator119723641這個結果是很讓人吃驚的,Sequences 比 Iterator 快
  • Kotlin使用指南之類篇特殊的類
    使用方法如下。}val demo = Outer.Nested().foo() // == 2```注意,Kotlin中的嵌套類並不是內部類,不能使用外部類的屬性,使用時和普通的類沒有區別,唯一的不同就是使用時要使用 Outer.Nested()這種方式來創建對象而不是直接Nested()內部類Kotlin的內部類要使用inner
  • Kotlin 都轉正成 Android 官方語言了,你還不試一下?
    目錄介紹官網及文檔中文社區教程 & 文章開源庫和框架Demo其他介紹為什麼要做這個?今天凌晨的 Google I/O 上,Google 正式宣布官方支持 Kotlin.如果有興趣,請加微信:404096378,備註「kotlin大全」官網及文檔中文社區教程 & 文章視頻教程開始用 Kotlin 之前Kotlin 語言程序設計上手 KotlinKotlin & Java開發實踐更多開源庫和框架Android