簡(jiǎn)介:
Kotlin 是一個(gè)基于 JVM 的新的編程語(yǔ)言钩杰,由 JetBrains 開(kāi)發(fā)纫塌。
Kotlin可以編譯成Java字節(jié)碼,也可以編譯成JavaScript讲弄,方便在沒(méi)有JVM的設(shè)備上運(yùn)行措左。
JetBrains,作為目前廣受歡迎的Java IDE IntelliJ 的提供商避除,在 Apache 許可下已經(jīng)開(kāi)源其Kotlin 編程語(yǔ)言怎披。
Kotlin已正式成為Android官方支持開(kāi)發(fā)語(yǔ)言胸嘁。
Google官網(wǎng)部分介紹:
If you're interested in using Kotlin, it's easy to get started because it works side by side with Java and C++ on Android. So you can keep your existing code, continue to use the various Android libraries, and incrementally add Kotlin code to your project. Unlike almost any other language, Kotlin is a drop-in replacement you can use bi-directionally—you can call into the Java language from Kotlin, and you can call into Kotlin from the Java language.
如果你對(duì)使用Kotlin感興趣,很容易開(kāi)始凉逛,因?yàn)樗贏ndroid上與Java和c++一起工作性宏。因此,您可以繼續(xù)使用現(xiàn)有的代碼状飞,繼續(xù)使用各種Android庫(kù)毫胜,并逐步將Kotlin代碼添加到項(xiàng)目中。與幾乎所有其他語(yǔ)言不同的是昔瞧,Kotlin是一個(gè)完全替代您可以使用雙向的替代方法——您可以從Kotlin調(diào)用Java語(yǔ)言指蚁,您可以從Java語(yǔ)言調(diào)用Kotlin。
Kotlin官網(wǎng)部分介紹:
Kotlin 非常適合開(kāi)發(fā) Android 應(yīng)用程序自晰,將現(xiàn)代語(yǔ)言的所有優(yōu)勢(shì)帶入 Android 平臺(tái)而不會(huì)引入任何新的限制:
- 兼容性:Kotlin 與 JDK 6 完全兼容凝化,保障了 Kotlin 應(yīng)用程序可以在較舊的 Android 設(shè)備上運(yùn)行而無(wú)任何問(wèn)題。Kotlin 工具在 Android Studio 中會(huì)完全支持酬荞,并且兼容 Android 構(gòu)建系統(tǒng)搓劫。
- 性能:由于非常相似的字節(jié)碼結(jié)構(gòu),Kotlin 應(yīng)用程序的運(yùn)行速度與 Java 類(lèi)似混巧。 隨著 Kotlin 對(duì)內(nèi)聯(lián)函數(shù)的支持枪向,使用 lambda 表達(dá)式的代碼通常比用 Java 寫(xiě)的代碼運(yùn)行得更快。
- 互操作性:Kotlin 可與 Java 進(jìn)行 100% 的互操作咧党,允許在 Kotlin 應(yīng)用程序中使用所有現(xiàn)有的 Android 庫(kù) 秘蛔。這包括注解處理,所以數(shù)據(jù)綁定和 Dagger 也是一樣傍衡。
- 占用:Kotlin 具有非常緊湊的運(yùn)行時(shí)庫(kù)深员,可以通過(guò)使用 ProGuard 進(jìn)一步減少。 在實(shí)際應(yīng)用程序中蛙埂,Kotlin 運(yùn)行時(shí)只增加幾百個(gè)方法以及 .apk 文件不到 100K 大小倦畅。
- 編譯時(shí)長(zhǎng):Kotlin 支持高效的增量編譯,所以對(duì)于清理構(gòu)建會(huì)有額外的開(kāi)銷(xiāo)绣的,增量構(gòu)建通常與 Java 一樣快或者更快叠赐。
- 學(xué)習(xí)曲線(xiàn):對(duì)于 Java 開(kāi)發(fā)人員,Kotlin 入門(mén)很容易屡江。包含在 Kotlin 插件中的自動(dòng) Java 到 Kotlin 的轉(zhuǎn)換器有助于邁出第一步芭概。Kotlin 心印 通過(guò)一系列互動(dòng)練習(xí)提供了語(yǔ)言主要功能的指南。
Kotlin從入門(mén)到上手
安裝使用
- Android3.0以下的版本通過(guò) File | Settings | Plugins | Install JetBrains plugin… 搜索并安裝 Kotlin 插件惩嘉。
- Android 3.0(preview)版本開(kāi)始已內(nèi)置安裝 Kotlin 插件谈山,可以直接使用開(kāi)發(fā)。
舊工程與新工程并存
使用kotlin開(kāi)發(fā)新工程與之前并無(wú)區(qū)別宏怔,創(chuàng)建一個(gè)新的工程奏路,只不過(guò)不再創(chuàng)建Java文件開(kāi)發(fā)畴椰,而是創(chuàng)建Kotlin文件,后綴為.kt
在舊工程上使用Kotlin開(kāi)發(fā)也是極為方便的鸽粉,我們可以把Java文件轉(zhuǎn)換為Kotlin文件斜脂,使用Code | Convert Java File to Kotlin File功能即可,或者使用Ctrl+Shift+Alt+K快捷鍵即可触机。Kotlin可以轉(zhuǎn)回Java嗎帚戳?這個(gè)是可以的,但是比較繁瑣儡首,而且我認(rèn)為這完全沒(méi)有必要片任。
- Menu>Tools>Kotlin>Show Kotlin Bytecode
- Click on the
Decompile
button - Copy the java code
通過(guò)這個(gè)方法轉(zhuǎn)化得到的Java代碼比較low,而且不能很好的還原lambda表達(dá)式蔬胯。
Why Kotlin
- 簡(jiǎn)潔对供,Kotlin大量的語(yǔ)法糖,讓我們使用更加方便快捷氛濒。
- 安全产场,Java異常排行第一,跟NullPointerException說(shuō)再見(jiàn)舞竿。
- 互操作性京景,可以使用JVM上的任何現(xiàn)有庫(kù),因?yàn)?00%的兼容性骗奖。
- 工具友好确徙,Android studio 可以使用提示或者快捷鍵快速構(gòu)建你的代碼。
下面就小試牛刀执桌,光說(shuō)好我可不信服鄙皇。
還在findViewById?
private ImageView chooseImageView;
@Override
public void initView() {
chooseImageView = (ImageView)findViewById(R.id.chooseImageView);
}
現(xiàn)在,我們可以什么都不用寫(xiě)就直接使用它鼻吮,Kotlin已經(jīng)幫我們做好了這部分工作。
使用Kotlin安卓擴(kuò)展:
apply plugin: 'kotlin-android-extensions'
僅僅需要導(dǎo)入指定的布局文件较鼓,就可以使用布局文件中所有的控件屬性:
import kotlinx.android.synthetic.main.<布局>.*
import kotlinx.android.synthetic.main.activity_main.*
@Override
public void initView() {
textView.text = "Hello, Kotlin!"
imageView.visibility = View.VISIBLE
}
沒(méi)錯(cuò)椎木,就是這么簡(jiǎn)單,直接用它的ID就可以使用它了博烂。
Get(),Set()太麻煩香椎?
在Kotlin中,定義變量的時(shí)候它就已經(jīng)封裝好了這兩個(gè)方法禽篱,常量則只有Get()方法畜伐。
class Hello{
var text : String = "Hello Kotlin"
val number = 1
}
class Test{
fun t{
Hello().number //Get方法
Hello().text = "New text" //Set方法
}
}
lambda表達(dá)式
bt_log.setOnClickListener {
// do something
}
window.addMouseListener(object : MouseAdapter() {
override fun mouseClicked(e: MouseEvent) {
// ...
}
override fun mouseEntered(e: MouseEvent) {
// ...
}
})
匿名對(duì)象只有一個(gè)方法和一個(gè)參數(shù)的話(huà)直接可以省略不寫(xiě),默認(rèn)參數(shù)為it躺率,多個(gè)參數(shù)則自己定義玛界,有多個(gè)方法的話(huà)則需要實(shí)現(xiàn)万矾。
集合的遍歷
HashMap<String, String> map = new HashMap<>();
map.put("1","a");
map.put("2","b")
map.put("3","c")
String str = "";
Iterator<Map.Entry> iterator = map.entrySet().iterator();
while (iterator.hasNext()){
Map.Entry next = iterator.next();
str += next.getKey() + "=" +next.getValue() + "\n";
}
var map = mapOf("1" to "a","2" to "b","3" to "c")
var str = ""
for((k,v) in map){
str = str + k + "=" + v + "\n"
}
對(duì)比一下Java和Kotlin的Map集合遍歷,沒(méi)錯(cuò)慎框,總是記不住的Map遍歷變得這么簡(jiǎn)單了良狈,只需要一行代碼即可:
for((k,v) in map),其中k和v就是Map的key和value了,你也可以隨便定義它笨枯。
空指針安全
var name: String? = null //該變量可能不會(huì)被賦值
var phone: String
var nlength1 = name.length //提示錯(cuò)誤
var nlength2 = name?.length //正確 如果name沒(méi)有賦值是空的薪丁,則返回null,反之返回length
var plength1 = phone.length //提示錯(cuò)誤 phone沒(méi)有被賦值
phone = "18697723086"
var plength2 = phone.length //正確
變量類(lèi)型后面帶?表示該字段有可能為空,如果你沒(méi)有賦值就直接使用則編譯不通過(guò)馅精,會(huì)提示你它可能為空严嗜,
user?.base?.info?.name
當(dāng)然,也可以多級(jí)使用洲敢,如果其中有一個(gè)對(duì)象為空的話(huà)就直接返回null,不會(huì)報(bào)空啦漫玄。
相互調(diào)用
Java代碼和Kotlin代碼可以相互調(diào)用,調(diào)用起來(lái)也十分簡(jiǎn)單沦疾。
public class JavaStringUtils {
public static boolean isEmpty(String str){
return str!=null&&!str.equals("");
}
public static class TestUtil{
public void testFun(){
/**
* java調(diào)用kotlin方法称近,方法的參數(shù)都得傳,因?yàn)閖ava中沒(méi)做處理
*/
Utils.Companion.toast("調(diào)用了Java方法哮塞,其實(shí)Java方法又調(diào)用了kotlin方法", Toast.LENGTH_SHORT);
}
}
}
class Utils{
/**
* 伴生對(duì)象
* Kotlin中沒(méi)有static靜態(tài)
* Java類(lèi)中在其被加載的時(shí)候刨秆,靜態(tài)的變量已經(jīng)初始化了
* Kotlin中則是分為實(shí)例變量和靜態(tài)變量?jī)深?lèi),Kotlin會(huì)將靜態(tài)的變量及方法打包在一個(gè)伴生類(lèi)中忆畅,即companion
*/
companion object {
/**
* 吐司提示
* toast("")
* toast("",Toast.LENGTH_SHORT)
* 默認(rèn)值可以不傳衡未,減少了方法的重載
*/
fun toast(msg: String,length: Int = Toast.LENGTH_SHORT){
Toast.makeText(App.application,msg,length).show()
}
fun log(tag: String = "ZZM",message: String){
Log.d(tag,message)
}
}
}
//調(diào)用了Java的靜態(tài)方法
var isTrue = JavaStringUtils.isEmpty("true") //自動(dòng)推斷為Boolean類(lèi)型
if(isTrue){
JavaStringUtils.TestUtil().testFun() //調(diào)用了Java的對(duì)象方法
}
看出來(lái)了吧,互相調(diào)用非常簡(jiǎn)單家凯,因?yàn)樗鼈兌际窍嗤ǖ幕捍祝詈闲?00%。
上面的小例子寫(xiě)在Demo中绊诲,Demo地址戳我送粱,歡迎大家同我一起學(xué)習(xí)Kotlin并分享學(xué)習(xí)經(jīng)驗(yàn)啦。
以上只是一些初步探索掂之,更多開(kāi)發(fā)使用語(yǔ)法請(qǐng)參考Kotlin語(yǔ)言文檔
https://baike.baidu.com/item/Kotlin/1133714?fr=aladdin
https://developer.android.google.cn/kotlin/index.html
https://www.kotlincn.net/docs/reference/android-overview.html