最強總結 | 帶你快速搞定kotlin開發(上篇)

2021-03-03 IT爛筆頭

fun sum(a: Int, b: Int): Int { 
    return a + b
}  
// 對於只有一行的函數,kotlin可以這麼簡寫,爽不?
fun sum(a:Int, b:Int): Int = a + b

可以看到函數的聲明是通過fun關鍵字的,函數的參數類型和參數名的位置跟Java是相反的,中間使用 分隔,函數的返回類型是放在最後的,當然也是使用 進行分割的,如果沒有返回值的時候可以省略或者使用Unit,相當於Java的void

var age:Int = 18
val name:String = "Kotlin"
val person = Person()

使用var來聲明可讀可寫變量,使用val來聲明只讀變量(引用不可變)。 
val可以理解為Java中的屬性聲明加上了final關鍵字(將kotlin的字節碼反編譯成Java一看就知道了),其實kotlin是更傾向於推薦使用val來聲明變量,這是一種防禦性的編碼思維模式,目的是減少程序出錯或者變的更加安全。 
可以看到實例化Person對象時,並沒有聲明變量類型,這就是Kotlin的「類型推斷」,會自動推斷出是Person類型的變量,而且是不需要Java中的new關鍵字的。

class MyActivity: Activity(), View.OnClickListener {
// 省略
}

一看就懂,不用多說吧。注意加上(),如果你的kotlin類能夠被繼承,需要使用open關鍵字,因為默認是final的:

open class Person {
    constructor(age: Int)
    var age: Int = 0
}
// 當你的構造函數調用父類的構造函數時,要去掉Person後面的()
class Man: Person {
    // 使用super調用父類的構造器
    constructor(age: Int): super(age)
}

// 不可空類型
val person: Person

// 可空類型
val person2: Person?

那麼對於可空類型的變量在調用時可以選擇使用:

val person: Person? = null
// 安全調用
person?.age = 18
// 強行調用
person!!.name = "kotlin"

使用調用符,就算person是null的也不會出現空指針了,相當於Java中的判空了。當然如果你能確認person不會為空,可以使用!!強行調用符

lateinit var person: Person
person = Person()

我們總有場景在聲明的時候不知道賦什麼值,在後面才去賦值的場景,那麼就可以使用lateinit關鍵字。但是只能在以下場景下使用:

if(p is Person) {
    p.age = 20
}
val man: Man = Person()
val per: Person = man as Person

is關鍵字類似於Java中的instanceof,判斷是否是什麼類型,判斷不是什麼類型可用!is,可以看到kotlin有個小優化,就是p在條件成立時,不需要再強轉了,直接被認為是Person的類型,進而可以使用Person的API。當你真的需要強轉時可以使用asas?關鍵字,帶?的在強轉失敗時並不會拋異常,而是返回一個null值

// Person.kt
Person::class
// Man.java
Man::class.java

區別於Java,kotlin要兼容Java,所以獲取Java的class和kotlin的class略有不同,kotlin的class使用::class,而在kotlin中獲取Java的class可以使用::class.java  

class Person {
    var age: Int? = null
}
// 等價於
class Person {
    var age: Int? = null
        get() {
            return field
        }
        set(value) {
            field = value
        }
}

kotlin在聲明非private的屬性時,會默認生成對應的公開的set和get方法,當你在Java中訪問時必須:

Person p = new Person();
p.setAge(20);

不過如果你就要直接訪問age屬性也是可以的,使用@JvmField註解:

// kotlin
class Person: Any {
    // kotlin構造函數使用constructor關鍵字
    constructor()
    // 加上這個註解,編譯器只會生成一個public的屬性,而不生成set和get方法
    @JvmField var age: Int = 19
}
// java
public class Test {
    private void some() {
        Person p = new Person();
        p.age = 20;
    }
}

open class Person {
    constructor(age: Int)
    var age: Int = 0

    fun test() {
         // 會有裝箱拆箱的操作,會影響性能
        val ages = arrayOf(14, 15, 16)
        // 基本數據類型使用對應的函數,比如intArrayOf()函數避免拆裝箱的過程
        val ages2 = intArrayOf(14, 15, 16)
    }
}

可以使用arrayOf()來創建數組。對於基本數據類型優先使用對應的函數進行創建。

// 方法在類的外面【包級函數】或者叫【頂層函數】
fun getSomething(): Int {
    return 0
}

class Person {}

// 在Java中使用類名+Kt後綴直接訪問
PersonKt.getSomething();

// 在kotlin文件中調用更加方便,只需要導包,不需要加類名
// 但是這種方式並不有利於閱讀,會和類中的函數搞混淆
getSomething()

可以看到我們可以直接在文件裡面聲明函數,然後通過類名+Kt的方式直接調用。這種叫包級函數  

object Person {
    fun getSomething(): Int {
           return 0
    }
}

// kotlin中調用
Person.getSomething()
// java中調用
Person.INSTANCE.getSomething();

其實使用object創建類的時候,默認會生成一個單例對象,當我們使用類名來直接調用的時候,其實是通過默認的單例對象進行調用的。本質上和我們java中的靜態方法還是不同的。

class Person {
    companion object {
        fun getSomething(): Int {
            return 0
        }
    }
}

// kotlin
Person.getSomething()
// java,好麻煩,但是可以使用註解@JvmStatic來讓編譯器編譯成靜態的
Person.Companion.getSomething();
// java 使用註解後就可以在Java中直接調用了
Person.getSomething();

使用companion object(伴生對象)的方式相當於有一個內部類的單例對象,這些通過kotlin的字節碼反編譯成Java文件就可以看出來。看起來比直接使用static關鍵字麻煩多了,那kotlin為啥要去掉static這個關鍵字呢?那得問當初設計kotlin語言的人了,從面向對象的角度來說,這麼設計的確更符合萬物皆對象的理念,因為static只跟類有關,而不是和對象有關。

所以,我們可以看出來使用object貌似和創建默認對象有關係,不錯,比如匿名內部類(本質上就是創建一個對象)

    var view = window.decorView
    fun test() {
        view.setOnClickListener (object : View.OnClickListener{
            override fun onClick(v: View?) {

            }
        })
    }
    // 當然可以簡寫成下面這樣
    fun test() {
        view.setOnClickListener {

        }
    }    

可以使用 ${} 來做字符串模板:

val age = 18
val info = "我是一個${age}歲的帥哥"

支持多行字符串,使用三個引號"""

    val info = """
        hhahha
        jaa
        sdfjdkjs
        jsafjs
    """.trimIndent()

判斷數據範圍和switch的使用:

// 如果年齡在10到30(包括30)
if(age in 10..30)
// 使用when取代Java中的switch,並且是支持表達式的
    when(age) {
        18->{

        }
        19->{

        }
        in 20..30-> {
        }
    }

在 Java 中通過 「 類名.this 例如 Outer.this 」 獲取目標類引用  
在 Kotlin中通過「this@類名 例如this@Outer」獲取目標類引用

相關焦點

  • Kotlin 一統天下?Kotlin/Native 支持 iOS 和 Web 開發
    兩款應用都已開源,你可以將它們作為模板,僅使用 Kotlin 構建自己的跨平臺移動應用。點此可了解其中一款應用。IDE 對 Kotlin/Native 的支持Kotlin/Native 也將迎來 IDE 的支持。
  • Kotlin 怎麼學 ?遇到過哪些坑?
    瀏覽kotlin 優勢和kotlin 坑這兩大章節,然後去學習 kotlin 基礎語法,根據第三章,kotlin 普及裡的建議,可以在實際開發中,開幹了。然後就可以像 java 一樣使用 kotlin,當然這不是我們的最終目的,因為 kotlin 的語法糖才是我們最後的目標。google 發布了 kotlin 簡易教程,大概只需要幾個小時,就可以看完:在實際的開發中,大概第一個星期內,你寫代碼的速度會下降一些,但是一個星期之後,完全上手了,寫代碼的速度是有很大的提升的。
  • 新課程上線 | 學習使用 Kotlin 進行 Android 開發的最佳時機!
    作者 / Android 開發技術推廣工程師 Kat Kuan如今,越來越多的人希望考慮能夠支持遠程辦公的職業,而從事應用開發或許可以實現
  • 使用Kotlin來開發Android,愛上它的優雅
    Kotlin相比Java有很多優勢,首先一點就是你可以用更少的代碼來做更多的事,其次Kotlin居然可以幫我們來避免空指針的問題,這個問題可是很多程序猿在寫代碼時時刻警惕著卻又不能很好避免的問題呢!而且使用集合的時候也很方便,而在安卓開發中,視圖綁定是必須要做的,雖然有黃油刀的輔助可能會省了不少力,但是現在Kotlin已經可以幫你很好的解決這個問題了!
  • 使用 Kotlin 進行 Android 測試
    Kotlin 程式語言開始之前,我會給這個後起之秀的主要好處來個快速總結:Kotlin 很簡潔。代碼寫得少,錯誤犯的少。Kotlin 非常具有表現力。你想用簡短的方式表達任何東西。Kotlin 非常實用。不需要繞來繞去直擊心底。Kotlin 對 Android 非常友好。一會兒你就能看到了。
  • Kotlin學習筆記——基礎篇
    1.基礎語法英文官網:https://kotlinlang.org/docs/reference/中文官網:https://www.kotlincn.net/docs/reference/協程學習資料:https://www.kotlincn.net/docs/reference/coroutines-overview.html
  • Kotlin入門教程,快使用Kotlin吧
    學習網站 Kotlin 從入門到放棄:https://www.jianshu.com/c/d3eac4c37b5fKotlin 菜鳥教程:http://www.runoob.com/kotlin/kotlin-tutorial.html基本語法 1、數據類型1.1、基本數據類型類型位寬度Double64Float32Long64Int32Short16Byte8每一個類型都有一個toXXX
  • Android開發必備的「80」個開源庫
    你所不知道的Android Studio調試技巧https://www.jianshu.com/p/011eb88f4e0d一份系統、全面的安卓進階學習指南https://github.com/iwannabetop/Awesome-Android-Learning-GuideTrinea - 性能優化系列總篇
  • Kotlin項目實戰之手機影音---悅單條目實現及BaseListFragment抽取
    由於比較簡單,這裡就快速來實現一下,順便過一遍上一次實現的首頁Tab當時構建的邏輯。設置布局:由於它的布局跟首頁Tab是一模一樣的,所以可以直接復用:com.kotlin.musicplayer.net.ResponseHandlerimport com.kotlin.musicplayer.net.YueDanRequestimport com.kotlin.musicplayer.presenter.
  • Kotlin 測試利器—MockK
    關鍵字  在 Kotlin 裡面 when是關鍵字,Mockito 的when ,必須加上反引號才能使用:`when`(xxxx).thenReturn(xxx)  如果看起來不舒服,也可以捨棄 Mockito 改用 mockito-kotlin
  • Kotlin函數式編程
    -> if (x > y) x else y }println(max(1, 2))lambda表達式還可以返回一個lambda表達式:val sum = { x: Int ->  {y:Int -> x+y } }println(sum)  println(sum(2)(1))  總結
  • 薦書 | Kotlin開發快速入門與實戰
    ;本書就是為這些人準備的學習與開發指南。為什麼要讀這本書如果你不知道這本書是否能幫助到自己,或者不知道是否要選擇這本書,那麼請先想一想在平時的學習或工作中是否遇到過以下這些問題:有想用Kotlin開發APP的想法,但是卻不知道該如何下手;剛學習了程式語言的if、for、while等各種語法,卻不知道利用它們到底能做些什麼;精通CPP、Java
  • 幾個特性,快速上手Kotlin
    這不是一個死扣細節的文章,而是一個幫助小夥伴們快速由Java(Android)轉向Kotlin的文章,因此更多的是一種語法與思想混在的模式。正文不多扯淡,點進來的小夥伴們肯定都是來學技術的,開搞。不不不,往下看,kotlin中的屬性大有文章。1.1、可觀察屬性Observable這個語言特性,是非常非常用意思,且實用的。不信?
  • Kotlin 1.2.70 發布,增量編譯速度提高 7 倍
    根據新的項目結構,這可以將開發速度提高 7 倍甚至更多。此外,Kotlin/JS Gradle builds 現在支持跨模塊增量編譯。需注意的是,增量編譯支持目前仍處於實驗階段,默認禁用,體驗前需手動啟用:在 Gradle 項目中,添加  kotlin.incremental.js=true到 gradle.properties或 local.properties在使用 IntelliJ IDEA 構建的項目中,轉到 Settings | Build, Execution, Deployment
  • 一款純Kotlin編寫的開源安卓應用 "Smile"
    我並不是在炫耀我的自學能力,Smile 的內容並不算多,肯定有很多大牛比我快,我想表達的是這 9 天的學習及開發過程是刀過竹解、得心應手的。所以我想把這個學習過程分享給大家,只要能幫到一個人,那就是有價值的。
  • Java到Kotlin,從入門到放棄
    去年冬天,在經過幾個月的日息相處之後,我們做了技術總結,最後的結論是Kotlin並沒有給我們代來什麼改進,反而拖慢了我們的進度。所以我們從入門到放棄,又回歸了Java 10。命名隱藏(Name shadowing)隱藏(shadowing)是Kotlin帶給我們的最大驚喜。
  • 開源之Kotlin:如何通過AS用kotlin編程做簡單的安卓手機APP
    從今天起,我們開始以趣味小實例小應用的形式來接觸學習探討Android下的手機等移動端編程kotlin編程。需要說明的是,雖然這裡這裡說是Android,不過一人客的設想是,以kotlin編程和官方IDE(知名IDE)為工具,以手機或其他行動裝置為平臺,以應用為實現載體,大方向不變,但並不排除會根據現實情況或學習進度轉用其他OS比如國產OS鴻蒙等。
  • 學習 Kotlin 的 20 個實用資源
    Android Announces Support for Kotlin – Android 宣布對 Kotlin 的支持Google 發表了官方博文,解釋了為什麼 Kotlin 能成為 Android 開發的第三官方語言。文章中簡單介紹了 Kotlin 帶來的一些優秀語法改進。
  • 程式語言 Kotlin 1.4 將推新的編譯器:今年春季發布
    Kotlin 1.4 將於 2020 年春季推出,其開發團隊在博客介紹了他們對 Kotlin 的願景:「讓 Kotlin 成為您所有工作的可靠伴侶,並是您執行任務的默認語言選擇。」因此,開發團隊將會讓開發者在所有平臺上都能使用 Kotlin。
  • 問:談談 Kotlin 範型與逆變協變?
    kotlin 系列文章均以 Java 差異為核心進行提煉,與 Java 相同部分不再列出。隨著 kotlin 官方版本的迭代,文中有些語法可能會發生變化,請務必留意。kotlin 泛型(generics)與 java 一樣,kotlin 的泛型用來表示變量類型的參數化。