1. 程式人生 > 其它 >Kotlin實戰【一】Kotlin定義與目的

Kotlin實戰【一】Kotlin定義與目的

Kotlin是什麼

針對Java平臺的新程式語言
Kotlin簡潔、安全、務實,專注於Java程式碼的互操作性
Kotlin是一種在Java虛擬機器上執行的靜態型別程式語言,被稱之為Android世界的Swift,由JetBrains設計開發並開源
在Google I/O 2017中,Google宣佈Kotlin成為Android官方開發語言

一、Kotlin初體驗

沒錯,如下圖,縱享絲滑~~~~~~~~~~~~~~~

kotlin,用過的都說好,你好、我好、大家好!!!!!!!!!!!!!!!

我們來舉個栗子:

建立一個Person類來表示一個“人”,建立一個“人”的集合,查詢其中年紀最大的人,並列印結果。

data class Person(val name: String,
                  val age: Int? = null)

fun main(args: Array<String>) {
    val persons = listOf(Person("Alice"),
                         Person("Bob", age = 29))

    val oldest = persons.maxBy { it.age ?: 0 }
    println("The oldest is: $oldest")
}

輸出:The oldest is: Person(name=Bob, age=29)

我們來依次解析:

"資料"類 ,括號中是引數,可空型別(?=),如果沒有傳該引數,則為null
data class Person(val name: String,
                  val age: Int? = null)
"頂層函式"
fun main(args: Array<String>) {}
其中 "age = 29" 是命名引數
Person("Bob", age = 29))
lambda表示式;Elvis運算子(左邊的值不為空時返回值,否則返回右邊的資料)
val oldest = persons.maxBy { it.age ?: 0 }
kotlin的String拼接方式 相當於String s = "aaa"+"bbb"+"ccc"
"The oldest is: $oldest" 

有沒有開始喜歡kotlin了,如果要用java實現上面的功能,程式碼可能需要多一半。這只是初體驗,記不住沒關係,沒看懂沒關係,後面的章節會慢慢深入講解。

二、Kotlin的主要特徵

1、目標平臺廣泛

(1)Kotlin 的首要目標是提供一種更簡潔、更高效、更安全的替代 Java 的語言,並且適用於現今使用 Java 的所有環境,包括web,安卓等

(2)Kotlin 還可以編譯成 JavaScript,允許你在瀏覽器中執行 Kotlin 程式碼。

2、靜態型別

Kotlin 和 Java 一樣是一種靜態型別的程式語言。這意味著所有表示式的型別在編譯期已經確定了,而編譯器就能驗證物件是否包含了你想訪問的方法或者欄位。

這與動態型別的程式語言形成了鮮明的對比,後者在 JVM 上的代表包括 Groovy 和 JRuby。這些語言允許你定義可以儲存任何資料型別的變數,或者返回任何資料型別的函式,並在執行時才解析方法和欄位引用。這會減少程式碼量並增加建立資料結構的靈活性。但它的缺點是,在編譯期不能發現像名字拼寫錯誤這樣的問題,繼而導致執行時的錯誤。

靜態型別的好處: - 效能——方法呼叫速度更快,因為不需要在執行時才來判斷呼叫的是哪個方法。 - 可靠性——編譯器驗證了程式的正確性,因而執行時崩潰的概率更低。 - 可維護性——陌生程式碼更容易維護,因為你可以看到程式碼中用到的物件的型別。 - 工具支援——靜態型別使 IDE 能提供可靠的重構、精確的程式碼補全以及其他特性。

3、函式式和麵向物件

作為一個 Java 開發者,你一定對面向物件程式設計的核心概念爛熟於胸,但函數語言程式設計對你來說卻可能不是很熟悉。

函數語言程式設計的核心概念如下 : - 頭等函式——把函式(一小段行為)當作值使用,可以用變數儲存它,把它當作引數傳遞,或者當作其他函式的返回值。 - 不可變性——使用不可變物件,這保證了它們的狀態在其建立之後不能再變化。 - 無副作用——使用的是純函式。此類函式在輸入相同時會產生同樣的結果,並且不會修改其他物件的狀態,也不會和外面的世界互動。

例子:

//=====過程式程式碼=====:
fun main(args: Array<String>) {
    val ints = listOf(1, 2, 3, 4, 5)
    var sum = 0
    for (i in ints) sum += i
    sum.log() 
    // Log 15
}
//===== 函式式程式碼=====:
fun main(args: Array<String>) {
    val ints = listOf(1, 2, 3, 4, 5)
    ints.fold(0){ a, b -> a + b }.log()
    // Log 15
}

優點:

(1)簡練:函式式風格的程式碼 比相應的命令式風格的程式碼更優雅、更簡練,因為把函式當作值可以讓你獲得更強 大的抽象能力,從而避免重複程式碼。 熟悉RxJava和java8的童鞋應該有所感受。

(2)安全:多執行緒程式中最大的錯誤來源之一就是,在沒有采用適當同步機制的情況下,在不同的執行緒上修改同一份資料。如果你使用的是不可變資料結構和純函式,就能保證這樣不安全的修改根 本不會發生,也就不需要考慮為其設計複雜的同步方案。

(3)測試容易:沒有副作用的函式可以獨立地進行測試,因為不需要寫大量的設定程式碼來構造它們所依賴的整個環境。

Kotlin特徵集

  • 函式型別,允許函式接受其他函式作為引數,或者返回其他函式。
  • lambda 表示式,讓你用最少的樣板程式碼方便地傳遞程式碼塊
  • 資料類,提供了建立不可變值物件的簡明語法
  • 標準庫中包括了豐富的 API 集合,讓你用函數語言程式設計風格操作物件和集合

Kotlin 允許你使用函數語言程式設計風格但並沒有強制你使用它。當你需要的時候,可以使用可變資料,也可以編寫帶副作用的函式,而且不需要跳過任何多餘的步驟。然後,毫無疑問的是,在 Kotlin 中使用基於介面和類層次結構的庫就像 Java 一樣簡單。當編寫 Kotlin 程式碼的時候,可以結合使用面向物件程式設計和函數語言程式設計風格,並使用最合適的工具來對付亟待解決的問題。

4、免費並開源

Kotlin 語言(包括編譯器、庫和所有相關工具)是完全開源的,並且可以自由使用。它採用 Apache 2 許可證 ;其開發過程完全公開在 kotlin上,並且歡迎來自社群的貢獻。如果你要開發 Kotlin 應用程式,有三種開源 IDE 供你選擇 :IntelliJ IDEA Community2 版、Android Studio 以及 Eclipse,它們都完 全支援 Kotlin(當然,IntelliJ IDEA Ultimate 也支援 Kotlin。)

三、Kotlin設計哲學

1、務實

Kotlin不是一門研究性語言,沒有試圖提升程式語言設計領域目前的技術水平,也沒有嘗試電腦科學的創新理念,而是儘可能依賴現有程式語言,來降低語言的複雜性,讓他更容易學習。

同時,IDE的支援也對Kotlin的支援也非常完美,對探索發揮著重要作用。許多情況下,工具會提示開發者更簡潔的結構替換通用程式碼模式。

2、簡潔

舉個例子:java需要1000行完成的功能,Kotlin只需要300行,就是這麼霸氣。

Kotlin保證你寫的程式碼具有實際意義。而且程式碼越簡單,你就能越快了解發生了什麼。

3、安全

最顯著地是NullPointerexception可以被扼殺在搖籃之中。Kotlin的型別系統跟蹤哪些可以或不可以為null的值,並且禁止哪些執行時可能導致的NullPointerexception

例如:

//可以為null
val s:String ?= null 

//不能為null
val s:String = ""

//不能為null
val s:String = ""</pre>

同時Kotlin有助於避免:ClassCastException,Kotlin中檢查和轉換被組合成一次操作,一旦檢查過該型別,就不需要額外的轉換就可以直接引用這個型別的成員。 例如:

if(value is String){            // 型別檢查
 println(values.toUpperCase())                //直接呼叫該型別的方法,不用額外的型別轉換
}

4、互操作性

我們任然可以使用現有的庫,可以呼叫java的方法,繼承java的類和實現java的介面,在Kotlin類上使用java的註解等等。 而且我們Koltin呼叫java,亦或java呼叫kotlin都毫不費力。

不光如此IDE的支援也是完美:

  • 自由的在java和Kotlin原始碼檔案之間切換
  • 除錯混合語言的專案,可以在不同語言編寫的程式碼之中單步除錯
  • 重構java方法的時候,kotlin程式碼中的對他們的呼叫也會得到更新
  • 重構kotlin方法的時候,java程式碼中的對他們的呼叫也會得到更新

四、Kotlin的編譯過程

Kotlin的原始碼存放在後綴名為.kt的檔案中。Kotlin的編譯器會分析原始碼並生成.class位元組碼檔案,這和java編譯過程相同。

kotlin中 - 你只需kotlinc命令就可以編譯程式碼,生成.class檔案;然後java執行程式碼 java中 - 你只需javac命令就可以編譯程式碼,生成.class檔案;然後java執行程式碼

下圖,kotlin編譯過程流程圖

kotlin編譯器編譯的程式碼依賴kotlin執行時庫,如上圖,他包括Kotlin自己的標準庫的定義,以及Kotlin對標準Java API的擴充套件。執行時庫需要和你的應用程式一起分發。

五、小結

  • Kotlin是靜態型別語言並支援型別推導,容許維護正確性與效能的同時保持原始碼的簡潔。
  • Kotlin支援面向物件和函數語言程式設計兩種風格,通過頭等函式使更高級別的抽象成為可能,通過支援不可變值簡化了測試和多執行緒開發
  • 在服務端工作很好,全面支援現有的java框架,為常見的任務提供了新工具,如生成HTML和持久化
  • 在安卓上也可以完美支援,為常見的Android開發提供了Kotlin友好的函式
  • 他完全免費和開源,全面支援主流的IDE和構建系統
  • Kotlin務實、安全、簡潔、與java可互操作,支援緊湊和易讀的程式碼,以及提供與java無限制的整合。
  • 防止了像NullPointerexceptionClassCastException的發生。

文章轉自 https://juejin.cn/post/6844903623177011207,如有侵權,請聯絡刪除。

相關視訊推薦:

Android進階系統學習——一節課搞定Kotlin核心技術_嗶哩嗶哩_bilibili
Android Kotlin 基礎教程【一】:手把手教你kotlin入門(一)_嗶哩嗶哩_bilibili
Android Kotlin 基礎教程【一】:手把手教你kotlin入門(二)_嗶哩嗶哩_bilibili
Android Kotlin教程【二】:kotlin函式入門(三)_嗶哩嗶哩_bilibili
【Android面試專題】:面試又被問到程序間通訊,你卻連Binder是什麼都不知道?_嗶哩嗶哩_bilibili