kotlintojava
⑴ 為什麼 Kotlin 調用 java 時可以使用 Lambda
1. Kotlin 中的 Lambda 表達式
如果你已經開始使用 Koltin, 或者對它有過一些了解的話,那麼一定對這種寫法並不陌生了:
// 代碼一:Kotlin 代碼view.setOnClickListener{
println("click")
}1234
它跟下面這段 Java 代碼是等價的:
// 代碼二:java 代碼view.setOnClickListener(new View.OnClickListener() { @Override
public void onClick(View v) {
System.out.println("click");
}
});1234567
和 Java8 一樣,Kotlin 是支持 Lambda 表達式的,如代碼一所示,就是 Lambda 的一個具體應用。
可見,使用 lambda 減少了很多冗餘,使代碼寫起來更簡潔優雅,讀起來也更順暢自然了。
但是,你有沒有想過,為什麼 Kotlin 可以這樣寫,這里為什麼可以使用 lambda ?
2. 為什麼可以這么寫?
在 Kotlin 中,一個 Lambda 就是一個匿名函數。
代碼一其實是對下面代碼三的簡寫:
// 代碼三:Kotlin 代碼view.setOnClickListener({
v -> println("click")
})1234
之所以簡寫成代碼一的樣子,是基於這兩點特性:
如果 lambda 是一個函數的唯一參數,那麼調用這個函數時可以省略圓括弧
如果 lambda 所表示的匿名函數只有一個參數,那麼可以省略它的聲明以及->符號(默認會用it來給省略的參數名命名)
- // 代碼六:kotlin中調用,這段代碼是編譯不過的TestSAM().setSam {
- println("dodo")
- }1234
- // 代碼七: 歧義消除// 方式一TestSAM().setSam (SamType1 { println("dodo") })
- // 方式二TestSAM().setSam ({ println("dodo") } as SamType1)12345
- // 代碼八: 使用一個實現介面的匿名類作為參數TestSAM().setSam(object : TestSAM.SamType1 { override fun doSomething(value: Int) {
- println("dodo")
- }
- })123456
OK,從代碼三的結構中,能夠更清晰的看出,這里的 view.setOnClickListener 函數是接收了一個 lambda 作為參數。而在 Kotlin 中,什麼樣的函數才能把lambda(也即另一個函數)作為參數呢?
—— 對,就是高階函數。
什麼是高階函數?
高階函數是將函數用作參數或返回值的函數。
這是 Kotlin 和 Java 的區別之一,java 中並沒有高階函數的支持(java8是有高階函數的)。當我們在 java 中需要用到類似的概念時,通常的做法是傳遞一個匿名類作為參數,然後實現其中的某些抽象方法 —— 就比如上面的代碼二。
事實上,如果在 Android Studio 中,從 Kotlin 的代碼查看 view.setOnClickListener 函數的定義,就會發現,看到的函數簽名就是一個高階函數的定義:
o(╯□╰)o
這種情況比較吊軌,但是還有有可能會出現的。這時候,如果在 Kotlin 中直接使用代碼一類似的方式,就會報錯了:
會提示這里歧義,編譯器不知道這個 Lambda 代表是 SamType1 跟 SamType2 中的哪一個介面。
解決的辦法就是手動標明 Lambda 需要代替的介面類型,有兩種方式可以來標明:
當然,也還有一種方法是不再使用 SAM 轉換的機制,而是直接使用一個 SamType1 的實例作為參數:
這種方法當然也是可以的,只是跟 lambda 相比起來,就顯得不那麼優雅了(優雅很重要!!!)。
5. SAM 轉換的限制
SAM 轉換的限制主要有兩點 :
5.1 只支持 java
即只適用與 Kotlin 中對 java 的調用,而不支持對 Kotlin 的調用
官方的解釋是 Kotlin 本身已經有了函數類型和高階函數等支持,所以不需要了再去轉換了。
如果你想使用類似的需要用 lambda 做參數的操作,應該自己去定義需要指定函數類型的高階函數。
5.2 只支持介面,不支持抽象類。
這個官方沒有多做解釋。
我想大概是為了避免混亂吧,畢竟如果支持抽象類的話,需要做強轉的地方就太多了。而且抽象類本身是允許有很多邏輯代碼在內部的,直接簡寫成一個 Lambda 的話,如果出了問題去定位錯誤的難度也加大了很多。
6. 總結
OK,講完了。
總結起來就是SAM 轉換就是 kotlin 在調用 java 代碼時能使用 Lambda 的原因。了解了其原理,能夠讓我們在寫代碼更自如,在偶爾出問題的時候也能更好更快地解決。
⑵ kotlin能取代java嗎的最新相關信息
我會建議使用純JAVA。而不要去考慮Kotlin。否則,你將失去兩大優勢。
首先要搞清楚,kotlin與JAVA之間,其實並沒有任何關系。kotlin是那個做IDE的Jetbrains公司創造的語言,它只和intellij IDEA這個IDE有關系。只是這個IDE,會在編譯的時候,把kotlin轉換成JAVA代碼。所以kotlin無形中,便把使用者與這個IDE捆綁在了一起。而並不是與JAVA捆綁在了一起。
失去的第一個優勢,便是從此無法自由選擇IDE。。。對於kotlin來講,將永遠只有一個IDE可以選擇。用戶會成為Jetbrains公司的奴隸。如果有一天,你必須離開這個IDE,那你將會淪為廢物,因為如果沒有IDEA,kotlin無法做到任何事,哪怕僅僅一個「hello world」都不能。
失去的第二個優勢則更加致命,也是JAVA可以獲得成功的原因之一。。。JAVA能做的事情,其實很多其他語言也能做到。。但為什麼JAVA可以如此受歡迎?除了JAVA本身的強大之外,還有一個原因在於,JAVA與C#語言,幾乎是一模一樣的。只有非常細微的差別,不僅語法一樣,而且連編程思想都一樣。只要掌握其中一門,完全可以在幾天之內,無師自通另外一門。然後就可以對照api文檔,去開發另外一門語言的程序了。所以學習JAVA的一大亮點就在於「學一門,會兩門」。
C#很了不起嗎?沒錯,非常了不起。。它本就可以視作JAVA獲得成功的最大幕後英雄。。但我不是來講故事的,因此微軟與sun公司的恩怨情仇不在此深究。
我只說三個關鍵點,你自然明白其中利害關系。
1,它是微軟的官方編程語言,微軟的親兒子,天生的富二代,Visual Studio便是為它量身設計。並且是微軟唯一可以跨平台的兒子。。微軟前不久又為它專門設計了輕量開發工具VS code。。不遠的未來,它將成為微軟的獨子。未來幾年,微軟幾乎全部工作都將與它有關。
2,它是游戲開發行業的第一大編程語言。佔有60%以上的份額。Unity3D,CE5,寒霜,夜光,這四大游戲引擎的標准語言。《口袋妖怪Go》《使命召喚》《FIFA》《極品飛車》《最終幻想14》等數以萬計的游戲都是由它開發而成。還包括國內最火的手游《王者榮耀》
3,它是虛擬現實(VR)設備開發的第一大語言。
扔掉JAVA,改用kotlin,也就等於與C#分道揚鑣。。。所付出的代價,在我看來是無與倫比的。
⑶ kotlin和java區別
Kotlin是JetBrains開發的基於JVM的語言;而Java是一種可以編寫跨平台應用軟體、完全面向對象的程序設計語言。Kotlin是對Java的一種改進,語法差異:
Kotlin中的方法和屬性可以不包含在類中;Java中的一切是以class為基礎的,都要在class中,帶旁碼但Kotlin不是;蠢哪
Kotlin中語句不需要以;結束,Java以;結束;
Kotlin中數據類型是後置的;
Kotlin方啟蠢法使用fun關鍵字定義;
Kotlin的類和方法默認是public final的;
Kotlin中類繼承和介面實現使用:標記;
Kotlin中使用var,val聲明變數及屬性,可以進行類型推斷,編譯器可以根據賦值自動推斷其類型為String,而Java聲明變數必須先指定其類型;
Kotlin存在非空與可空類型
Kotlin中package可以與文件路徑不一致;
⑷ kotlin和java區別是什麼
kotlin能夠用更短的代碼實現更多蠢氏的功能,這是java無法比擬的。kotlin特有的擴展屬性,不再需要java工具類,對開發更加友好。
java中的bean類總是需要使用插件生成settergetter方法。
開放源碼
TheIntelliJKotlin插件擴展了Java編譯器使得Kotlin代碼能夠得以編寫、編譯和調試。除此之外,關於基本的Java集合,已經有編寫好的幫助函數,可以更順暢地銜接將在Java8中出現的集合擴展。有兩篇文章對Kotlin與Java以及Kotlin與Scala分別進行了比較,對各自特性和異同進行了對比。
其基礎編譯器可以被獨立出來並嵌入到Maven、Ant或Gradle工具鏈中。這使得在IDE中開發的代碼能夠利用已有的機制來構建,從而盡可能地減少了在新環境中使談臘用所受的干預,哪怕與那些沒有安裝Kotlin插件的開發人員一起合作項目也沒有問題。
即便Scala可能還是更為強大些,Kotlin還是嘗試著提供比Java更好的函數、模帶侍散式匹配、空指針預防和泛型。
⑸ 如何將kotlin文件轉化為java
新建叢判一個沒仿Android項目。
修枯鄭纖改Gradle代碼來添加Kotlin Gradle插件與標准庫。
在IntelliJ或Android Studio中添加Kotlin插件。
將Kotlin類文件轉換成java。
⑹ Kotlin會替代java嗎
下面來講一下Kotlin和Java相比的優勢是什麼?
更簡潔:這是它重畢培要的優點之一,可以比Java編寫少得多的代碼。
更安全:Kotlin是空安全的,它在編譯期間就會處理各種為null的情況,無需像java一樣添加很多的判空代碼,節約很多調試空
指針異常的時間,很大程度上避免出現NullPointException。
易擴展:擴展函數意味著我們不僅可以擴展我們原有寫好的類,還可以擴展系統級的類,非常靈活,另外如果在類里編寫擴展函數,那麼只對當前類生效。
函數式:Kotlin使用了很多函數式編程的概念,比如用到了lambda表達式來更方便地解決問題。
Kotlin Android Extensions:再也不用編寫物燃煩人的findViewById()了,如果你集成了ButterKnife,是時候刪除對它的依賴了,
Kotlin支持了對於View以id形式訪問。
不用寫分號,就像你看到的上述代碼一樣,對於很多寫過腳本語言的童鞋來說,不要寫分號這一點真是節省了很多時間,對於一
天寫幾百行幾千行甚至上萬行代碼的童鞋們來說,相當於省了多少個分號.
到這里有的同學想要說了,你說的這些好處確實不錯,但是我之前的項目全是用java語言來寫的,難不成讓我推倒重來過?別急
,最後我要說的一個最大的優勢就是
與Java語言可混合編程,也就是說我們可以繼續使用原來所有用Java寫的代碼和庫,因為兩個語言之間高度互操作,想嘗試的童
鞋們建議可手螞唯以從新的小功能小模塊入手,對這些模塊使用Kotlin代碼進行編寫,原有的穩定模塊之後再逐步重構。
對初學者友好,kotlin對java語言轉用kotlin提供了很多便利,對於初學者來說免去很多不必要的煩惱。最貼心的是Kotlin插件
支持一鍵由Java轉Kotlin,為你之後想要重構提供了很大的便利性。希望能幫到你,優「」就「」業「」野「」雞「」希望你能明白
⑺ kotlin能和java混用嗎
可以的,Kotlin與Java是兼容的。