Kotlin初學者指南
你好,世界
Kotlin是一種靜態型別語言,在JVM上執行,並且與現有Java程式碼具有100%的互操作性。 對於大多數Java開發人員來說,下面的程式應該非常熟悉:
包 com。bugsnag。科特林 ;
公共 課 App {
public static void main(String [] args){
系統。出。println(“Hello World!”);
}
}
以下將在 Kotlin中 列印“Hello World” :
fun main(args:Array < String >){
println(“Hello World!”)
}
一些差異是顯而易見的,例如缺少分號以及我們的程式碼是多麼簡潔。
科特林與 Java的
為了瞭解Kotlin,讓我們仔細看看它的功能以及它們與Java的比較。
無安全性
我們將首先探索Kotlin最有用的功能之一 - 它支援null安全性。
在Java中,任何物件都可以
null
。
這意味著必須在整個程式碼庫中新增執行時檢查以防止
NullPointerException
崩潰,這通常被
語言設計者
稱為
十億美元的錯誤
。
靜態 類 使用者 {
字串 名稱 ;
}
public void printUsername(User user){
如果(使用者。名字 != 空){
FOO(使用者。名。長度());
}
}
在Kotlin中,物件的引用必須是可空的或非空的:
class User(var name:String ?)// name屬性可以為null
class User(var name:String)// name屬性不能為null
如果開發人員試圖將可以為空的物件傳遞給第二個類,則會發生編譯時錯誤。
安全呼叫運營商
以下對大多數Java開發人員來說非常熟悉。
所述
user
引數可以是
null
,所以需要執行時檢查以確保
NPE
避免。
void printUsername(User user){
如果(使用者。的getName()!= 空){
FOO(使用者。的getName()長度());
} else {
foo(null); //提供一個null整數
}
}
void foo(整數 長度){}
Kotlin可以透過
Safe Call
操作員
簡化這一過程
。
如果
name
不為null,則其長度將作為引數傳遞。
否則,將傳遞空引用。
fun printUsername(user:User){
FOO(使用者。名字?。長度)如果user.name為空//返回null
}
fun foo(length:Int ?){}
或者,如果在值為null時執行程式碼沒有意義,我們可以使用
let
:
fun foo(nullableUser:User ?){
nullableUser ?。let { printUsername(nullableUser)} //只列印非空使用者名稱
}
fun printUsername(user:User){} // User是非空引用
類定義
與Java相比, Kotlin 類 非常簡潔。 下面的類定義了三個欄位,getter和setter超過30行!
class User {
最終 字串 名稱 ;
int age = 18 ;
字串 地址 ;
public User(String name,int age,String address){
這個。name = name ;
這個。年齡 = 年齡 ;
這個。地址 = 地址 ;
}
public String getName(){
返回 名稱 ;
}
public int getAge(){
迴歸 年齡 ;
}
public void setAge(int age){
這個。年齡 = 年齡 ;
}
public String getAddress(){
返回 地址 ;
}
public void setAddress(String address){
這個。地址 = 地址 ;
}
}
在Kotlin中,我們可以使用一行程式碼實現相同的功能。
class User(val name:String,var age:Int = 18,var address:String ?)
不可變引用也更容易。
這只是從
var
關鍵字
切換
到的問題
val
。
您可能已經注意到,對於Kotlin,可以為引數提供預設值。 這意味著 可以在Kotlin中消除 Java模式,例如 Builder模式 。 這也可以大大減少語法糖所需的程式碼量,例如公共API中的方法鏈。
資料類
如果我們類的主要目的是儲存資料,例如來自API的JSON有效負載,事情會變得更加簡潔。 在Kotlin中,這些被稱為 資料類 。
data class User(val name:String,var age:Int = 18,var address:String ?)
只需新增
data
關鍵字會自動生成
equals()
,
hashCode()
,
toString()
,並
copy()
為我們的類實現。
省略了此類的等效Java實現,以節省讀者的理智和頻寬成本。
型別推斷
Kotlin使用型別推斷,這進一步增加了它的簡潔性。 考慮一下這個Java類:
class AbstractSingletonProxyFactoryBean {}
public void foo(){
AbstractSingletonProxyFactoryBean bean = new AbstractSingletonProxyFactoryBean();
}
而Kotlin中的等價物看起來像這樣:
class AbstractSingletonProxyFactoryBean
fun foo(){
val bean = AbstractSingletonProxyFactoryBean()//自動推斷型別
}
功能
型別推斷滲透到整個語言中。 在需要時可以是顯式的或隱式的,如下面定義相同函式的兩種方法所示:
int add(int a,int b){
返回 a + b ;
}
fun add(a:Int,b:Int):Int { //顯式返回型別
返回 a + b
}
fun add(a:Int,b:Int)= a + b //推斷的返回型別
屬性
Kotlin Properties 簡直太棒了。 考慮以下Java類,它使用訪問器方法定義單個欄位:
class Book {
字串 作者 ;
String getAuthor(){
迴歸 作者 ;
}
void setAuthor(String author){
這個。作者 = 作者 ;
}
}
書 書 = 新的 圖書();
書。setAuthor(“Kurt Vonnegut”);
系統。出。的println(書。getAuthor());
透過定義宣告
author
屬性
的類,可以在Kotlin的四行中實現等效功能
。
我們將自動生成我們的getter和setter:
class Book(var author:String ?)
val book = 書()
書。author = “Kurt Vonnegut”
println(書。作者)
自定義訪問者
如果getter和setter需要自定義行為,則可以覆蓋預設行為。 例如:
class Person(var firstName:String,var lastName:String){
var fullName:String
get()= “$ {firstName} $ {lastName}”
set(value){
val split = value。拆分(“”)
firstName = split [ 0 ]
lastName = split [ 1 ]
}
}
如果我們需要驗證欄位或將其限制為某些輸入, 也可以使用 支援欄位 :
set(value){
如果(“聖誕老人”。等於(值))欄位 = “蠔HO”
}
互通性
Kotlin的另一個優點是可以從同一個專案中的Java程式碼中呼叫它,反之亦然。
公共 類 MyJavaClass {
public String authorName ;
public boolean isTruthyValue(){
返回 true ;
}
}
以下Kotlin函式例項化一個新的Java物件,並使用常規的Kotlin語法訪問其方法和欄位。 如果您想透過向現有Java程式碼庫新增少量Kotlin來將腳趾浸入水中,這將非常方便。
fun main(args:Array < String >){
val obj = MyJavaClass()
的println(OBJ。AUTHORNAME)
的println(OBJ。isTruthyValue)
}
還值得一提的是,Kotlin可以 反編譯回Java ,因此如果您的團隊不喜歡該語言或遇到技術障礙,那麼完全可以遷移回來。
實用方法
所有Java開發人員都會非常熟悉實用程式或幫助程式類。 靜態方法將執行Java標準庫中不可用的一些有用操作,並將在程式碼庫中呼叫:
class StringUtils {
static String sortStringChars(String input){
char [] chars = 輸入。toCharArray();
陣列。排序(字元);
return new String(chars);
}
}
StringUtils。sortStringChars(“azbso”); //返回“abosz”
在Kotlin中,
擴充套件
允許將其他功能新增到現有類中,
而
無需擴充套件或包裝該類。
例如,以下內容將向
該類
新增一個
sortStringChars
函式
String
:
有趣的 字串。sortStringChars():String {
val chars = 這個。toCharArray()
陣列。排序(字元)
return String(chars)
}
fun main(args:Array < String >){
“azbso”。sortStringChars()//返回“abosz”
}
這導致語法更易讀 - 但要注意。 強大的力量帶來了 巨大的責任 。
功能程式設計
Kotlin完全支援lambda表示式。 有限的Java 8支援剛剛 新增到Android中 ,這使得Kotlin的功能程式設計功能特別受歡迎。
//為名稱以“J”開頭的所有作者篩選一個列表
val input = listOf(“JK羅琳”,“查爾斯達爾文”)
val authors = 輸入。過濾器 { 作者 - > 作者。startsWith(“J”)}
println(作者)// JK羅琳
也可以
在Collections上
使用諸如
filter
和
map
直接
構造
,這在大多數Android裝置上目前都不支援。
fun main(args:Array < String >){
val input = listOf(“JK羅琳”,“查爾斯達爾文”,“”)
val authors = 輸入。過濾 { !它。isEmpty()} //刪除空值
。map { Author(it)} //將字串對映到作者物件
。sortedBy { it。name } //按作者名排序
println(authors)//按字母順序列印作者
}
Reactive Streams最近在Android世界中流行起來, RxKotlin 庫 也為Kotlin提供了支援 。
val cereals = listOf(“Kellogs Coroutines”,“Cocoa Pods”,“Locky Charms”)
穀物。toObservable()
//在後臺執行緒上執行一些密集/複雜的計算
。subscribeBy(onNext = {
println(it)//觀察主線上的每個穀物並列印出來
})
Kotlin Native和Javascript
Kotlin主要針對JVM,但也可以 使用LLVM工具鏈 轉換為Javascript 或編譯為本機程式碼。 這兩個目標在開發階段還處於初期階段,但對於希望在整個堆疊中使用一種語言進行程式設計的人來說,這顯示了很大的希望。
Kotlin Native特別有趣,因為Swift 看起來與Kotlin非常相似 ,這意味著有朝一日可能會在Android和iOS應用程式中使用相同的本機程式碼庫。
另一個值得一提的是
Gradle Script Kotlin
,它將靜態型別的所有好處帶到現有的Gradle DSL和
Spring Boot
,後者為Kotlin提供官方支援
1.5
。
潛在的下行
那麼Kotlin的缺點是什麼?
在Android上,應用程式大小是一個潛在的問題。 Kotlin目前 為您的應用程式大小 增加了大約 1Mb, 並使用了大約7,000種方法,儘管其中大部分都可以被 Proguard 剝離 。 對於傳統的Java桌面應用程式來說,這不是什麼大不了的事,但對於擁有更多資源限制的移動裝置,這對某些團隊來說可能是一個交易破壞者。
Kotlin並沒有和Java一樣長,因此,識別不良做法和程式碼味道要困難得多。 Java有22年的良好實踐和linting工具可供借鑑,而Kotlin卻沒有。 例如,擴充套件函式是一個非常強大的功能,但可以輕鬆地用於應該使用類和抽象的地方。
更人性化的因素是儘管Kotlin與Java非常相似; 學習一門新語言總會有一段時間,這會導致生產力暫時下降。
特別是如果團隊中的每個人都在過去十年中成為Java專家,他們可能不願意放棄並以他們不熟悉的語言重新開始。 外部客戶可能對Kotlin感到不太滿意,因為有人認為它與Java一樣久不存在,並且更為未知。
為什麼Kotlin擊敗Java
讓我們總結一下Kotlin的一些主要優點:
-
科特林是 遠遠 比Java更簡潔
-
Lambdas和功能構造已經開箱即用多年
-
100%與現有Java程式碼的互操作性
-
Kotlin實際上消除了最常見的Java錯誤之一,可怕的
NullPointerException
-
IntelliJ IDEA提供出色的工具支援
-
這種語言是從頭開始編寫的,因此,它 感覺 就像是每天都在其中程式設計的人設計的語言
我們認為,由於這些原因,Kotlin在Android上擊敗了Java。 在傳統的Java桌面應用程式中,由於Java 8包含可比較的語言功能,例如lambda,流和其他,因此它是一個更接近的競爭。 但是,我們仍然相信Kotlin的簡潔性在這種情況下獲勝。
關於Kotlin入門的建議
在一篇部落格文章中總結一下程式語言是不可能的,所以如果你或你的團隊有興趣使用Kotlin,我們的建議只是試一試!
最常見的兩條路線是在Kotlin中編寫單元測試或將現有的Utils類轉換為Kotlin。 IntelliJ IDEA還提供了一個方便的自動轉換快捷方式,可將現有Java程式碼遷移到Kotlin。 雖然這不一定會給你最慣用的Kotlin,但它是一種在你熟悉的程式碼庫中學習語法的好方法。
最重要的是不斷評估每個人是否對Kotlin的採用水平感到滿意,並確定任何痛點或隱藏的陷阱。
Kotlin是Java的一個非常好的替代品,如果做得好,它有可能提高開發人員的快樂,降低程式碼庫的複雜性,並提高業務的生產力。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31557424/viewspace-2284299/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Nginx初學者指南Nginx
- Groovy初學者指南
- 【譯】GraphQL 初學者指南
- OAuth 2.0初學者指南OAuth
- Apache Hudi初學者指南Apache
- Java初學者入門指南Java
- 給初學者的Web安全指南Web
- 圖資料庫初學者指南資料庫
- Electron 的初學者詳細指南
- 5S管理--初學者指南
- [譯] 網站優化初學者指南網站優化
- React Redux 的初學者詳盡指南ReactRedux
- 模糊測試: 初學者入門指南
- 價值流圖 (VSM) 初學者指南
- 自動機器學習和AI初學者指南機器學習AI
- 給初學者的以太坊路線圖指南
- 一份送給Java初學者的指南Java
- 一份全面的初學者實用指南
- 產品開發專案管理初學者指南專案管理
- 【Kotlin】初識Kotlin(二)Kotlin
- 區塊鏈初學者指南——五歲孩子都能理解區塊鏈
- [譯] 為 GitHub 專案做出貢獻的初學者指南Github
- [譯]網路效能入門:2019年初學者指南
- 使用開源工具構建 DevOps 流水線的初學者指南開源工具dev
- 資料視覺化初學者指南:定義、示例和工具視覺化
- 適合初學者的who 命令的解釋與示例指南
- 【Kotlin】初識Kotlin之物件導向Kotlin物件
- 適用於初學者的完整雲端計算學習路線指南
- Kotlin修煉指南Kotlin
- 始於Jupyter Notebooks:一份全面的初學者實用指南
- 初學者Mybatis的初級使用MyBatis
- 致 Python 初學者Python
- 01 【初學者】引子
- 初識Kotlin之集合Kotlin
- 初學Kotlin——在自定義View裡的應用KotlinView
- 層級聚類和Python實現的初學者指南(附連結)聚類Python
- DevOps 初學者寶典dev
- 致 Python 初學者們!Python