Kotlin 概覽——如何看待 Google 將 Kotlin 選為 Android 官方語言?
本文原發於:https://hltj.me/kotlin/2017/05/18/kotlin-official-on-android.html 。
Kotlin 作為 Android 開發語言是大勢所趨。
在此之前很早,Kotlin 就有“Android 世界的 Swift ”的稱號。當然在這之前大家這樣說難免有些底氣不足,與其說是一種事實不如說是一種願望。而現在這麼說就理直氣壯多了。當然之前就已經有很多地方在實踐用 Kotlin 做安卓開發了,比如魅族、騰訊, Kotlin 中文站 創始人, Kotlin 中文部落格 維護人分別來自這兩家。
Kotlin 語言相對 Java 有很多優勢,比如官網介紹的簡潔、安全,示例參見 Kotlin 中文站 首頁,部分示例解析見下文。Kotlin 具有現代(也有稱下一代的)靜態程式語言的很多特點,如型別推斷、多正規化支援、可空性表達、擴充套件函式、DSL 支援等。另外對於安卓開發還提供了 Kotlin 安卓擴充套件和 Anko 庫,參見 Kotlin 用於 Android 。
關於與 Java 互操作,尤其是 Java 呼叫 Kotlin 是大家普遍覺得坑的地方,除了預設 final 外,還有一個主要原因應該就是名字修飾,解決方式可以按照它修飾後名字去引用,或者在 Kotlin 端使用 @JvmName
註解來生成便於 Java 使用的名字。具體參見 Java 中呼叫 Kotlin 。
讓我們看下官方給出的一些例子:
簡潔性
使用一行程式碼建立一個包含 getters、 setters、
equals()
、hashCode()
、toString()
以及copy()
的 POJO:data class Customer(val name: String, val email: String, val company: String)
這個對於 Java 恐怕要寫半屏到一屏程式碼,如果用 Lombok 能好一些,但也不及 Kotlin 簡潔。瞭解更多請參見資料類。另外可以看到一個小細節,Kotlin 可以不用打;
。
或者使用 lambda 表示式來過濾列表:
val positiveNumbers = list.filter { it > 0 }
注意到了嗎?它用 it
來簡化單引數的 Lambda 表示式,瞭解更多請參見 Lambda 表示式。
想要單例?建立一個 object 就可以了:
object ThisIsASingleton { val companyName: String = "JetBrains" }
簡潔之至,無需贅述。瞭解更多請參見物件。
安全性 ——可空性表達 與 型別判斷
徹底告別那些煩人的 NullPointerException,著名的十億美金的錯誤。
var output: String output = null // 編譯錯誤
無特殊標誌的變數預設不可空。
Kotlin 可以保護你避免對可空型別的誤操作
val name: String? = null // 可空型別 println(name.length()) // 編譯錯誤
可空變數的型別需要字尾 ?
,對於可空變數在未判斷其可空性時不可直接呼叫其方法或訪問其屬性。瞭解更多請參見空安全。
另外這裡用 val
宣告的變數是不可變的,對於不可變變數有很多好處,比如併發安全、適合函數語言程式設計等等。參見基礎語法。
並且如果你檢查型別是正確的,編譯器會為你做自動型別轉換
fun calculateTotal(obj: Any) { if (obj is Invoice) obj.calculateTotal() }
型別在判斷後自動轉換為相應物件;另外,對於可空變數,做非空性判斷的相應分支也能自動轉成非空值。
DSL
讓我們看一個複雜一點的例子,構造 HTML 的 DSL 程式碼:
val data = mapOf(1 to "one", 2 to "two") createHTML().table { for ((num, string) in data) { // 遍歷資料 tr { // 建立 HTML 標籤的函式 td { +"$num" } td { +string } // 輸出變數的值 } } }
這個例子比較複雜,建議對 Kotlin 熟悉一定程度再來看。
最上方宣告瞭一個不可變的 data
作為建立 HTML 用的資料。它是一個由 mapOf
函式建立的對映(map),其中用擴充套件函式 to
的中綴呼叫形式來建立鍵值對。
接下來的 table
是一個方法(或擴充套件函式),
它接受一個 Lambda 表示式,對於這種情況的函式呼叫可省略括號。之後 for 迴圈中的 tr
和 td
與 table
類似,
只是它們有隱式接收者。
此外 for 迴圈的條件用到了解構宣告,
兩個 td
傳入的 Lambda 表示式都用到了操作符過載,
對於第一個還用到了字串模版。
本文原是我在知乎上的回答,經整理並補充示例解析而來(然後又更新到回答答案中),知乎原文:如何看待 Google 將 Kotlin 選為 Android 官方語言?。
我是 Kotlin 中文站維護人,中文站就是 Kotlin 官方英文站的中文翻譯,目前已經完成參考文件的翻譯:參考 - Kotlin 語言中文站 。 這應該也是目前唯一一份最新且完整的官方參考文件中文翻譯,參見我上一篇Kotlin 官方參考文件翻譯完畢。歡迎大家反饋問題及一同翻譯。
相關文章
- Kotlin-first - 谷歌宣佈Kotlin成為Android開發首選語言Kotlin谷歌Android
- Android谷歌官方語言Kotlin用法入門教程Android谷歌Kotlin
- Kotlin成為正式的Android程式語言KotlinAndroid
- 【譯】將 Android 專案遷移到 Kotlin 語言AndroidKotlin
- 大事件:Kotlin 成了 Android 開發的官方語言事件KotlinAndroid
- Kotlin 程式語言初探Kotlin
- Dart語言概覽Dart
- 17 位谷歌 Android 開發專家是如何看待 Kotlin 的?谷歌AndroidKotlin
- Kotlin 都轉正成 Android 官方語言了,你還不試一下?KotlinAndroid
- Android如何在kotlin中進行函數語言程式設計?kotlin版本原始碼解析AndroidKotlin函數程式設計原始碼
- Android 騰訊Bugly熱更新接入(Kotlin語言)AndroidKotlin
- 程式語言概覽(90%)
- 為什麼Kotlin比任何愚蠢的語言更好Kotlin
- Android開發基礎08-掌握kotlin語言AndroidKotlin
- Kotlin語言極簡介紹Kotlin
- (翻譯)Dart語言概覽Dart
- 使用 Kotlin 語言開發 NeoForge 模組Kotlin
- 認識一下Kotlin語言,Android平臺的SwiftKotlinAndroidSwift
- Kotlin 語言入門寶典 | Android 開發者 FAQ Vol.5KotlinAndroid
- 幾分鐘內學會Kotlin語言Kotlin
- Android-貪吃蛇小遊戲-分析與實現-Kotlin語言描述Android遊戲Kotlin
- Kotlin開發之旅《二》—Kotlin的基本語法Kotlin
- kotlin中將回撥改寫為協程Kotlin
- PYPL 6月程式語言排行:Kotlin與PHP亮了KotlinPHP
- 用Kotlin實現Android點選事件的方法KotlinAndroid事件
- Kotlin對決Java:Android開發的選擇?KotlinJavaAndroid
- android kotlin 安全除法AndroidKotlin
- kotlin基礎語法Kotlin
- TIOBE 12 月程式語言排行榜:Kotlin 和 C 有望成年度語言Kotlin
- 自然語言處理技術詳細概覽自然語言處理
- Google IO/19 - Kotlin 1.3,更多新特性GoKotlin
- 使用Kotlin語言兩年後,我有話要說Kotlin
- Kotlin/Nativev0.3,將Kotlin編譯成機器碼Kotlin編譯機器碼
- 【譯】kotlin 協程官方文件(6)-通道(Channels)Kotlin
- Kotlin 官方參考文件翻譯完畢Kotlin
- Android kotlin中配置protobufAndroidKotlin
- Android 新貴 kotlin (3)AndroidKotlin
- Android Kotlin 協程初探AndroidKotlin