Google在2017的IO大會(huì)上宣布將Kotlin作為Android開(kāi)發(fā)的官方語(yǔ)言。這一重磅消息凹炸,以春風(fēng)又綠江南岸之勢(shì)戏阅,迅速奪取了大多數(shù)Android開(kāi)發(fā)人員的眼球。那么就讓我們以熱烈的歌聲歡迎已經(jīng)七歲的Kotlin登場(chǎng)(鼓掌)啤它。
Kotlin不思議
突然地想念你
彩繪玻璃前的身影
只有孤單變濃郁
Kotlin不思議
突然那么想念你
我?guī)е鴲?ài)抒情的遠(yuǎn)行
--《馬德里》(有刪改)
老規(guī)矩奕筐,先奉上Kotlin官方網(wǎng)站和中文網(wǎng)站,以備查閱变骡。其余的資料匯總离赫,會(huì)在文章末尾附送,資料之多塌碌,亂花漸欲迷人眼渊胸。由于是初次接觸Kotlin,錯(cuò)誤再所難免誊爹,歡迎留言指正批評(píng)蹬刷。
一:Kotlin基本語(yǔ)法
1:定義函數(shù)
(1):這里定義了一個(gè)兩個(gè)整數(shù)之間的乘法的函數(shù),Int注意首字母要大寫频丘,而且在返回值對(duì)應(yīng)的類型办成,應(yīng)該寫在大括號(hào)的前面,而不是緊跟fun之后搂漠。
fun mul(a:Int,b:Int):Int{
return a*b;
}
(2):上面只是一種寫法迂卢,還有另外一種返回值類型自動(dòng)推斷的用法
fun mul(a:Int,b:Int)=a*b
(3):當(dāng)我們不需要函數(shù)返回值時(shí),可以用Unit
fun mul(a:Int,b:Int):Unit{
println("kotlin綿綿無(wú)期")
}
(4) :Unit 還可以省略,于是就出現(xiàn)了這種和自動(dòng)推動(dòng)有些像的寫法
fun mul(a:Int,b:Int) {
println("長(zhǎng)恨kotlin非我有")
}
2:定義局部變量
(1):下面這種定義的屬于常量而克,只讀靶壮,不可以修改,使用了關(guān)鍵字val员萍。
val kot:Int = 5 //立即賦值
val lin=2 // 推斷賦值
val love:Int // 如果沒(méi)有明確賦值腾降,那么類型就不可以省略
love=520 // 然后再單獨(dú)給她賦值
(2):下面這種定義屬于變量,使用關(guān)鍵字var
var you =5 //自動(dòng)推斷出類型
you+=520
3:字符串模版
var love=520
val temp1="love is $love"
love=525
var temp2="${temp1.replace("is","was")},but now is $love"
上面的這段代碼temp2這個(gè)字符串實(shí)際上就是"love was 520,but now is 525".這里的love被賦值了兩次碎绎,第一次是520螃壤,第二次是525.
4:三元操作符沒(méi)有,可以用if取代
val temp = if(args.size==0) "english" else args[0]
不僅變量可以賦值筋帖,就連方法也可以奸晴,但是這種算不算給方法賦值呢?
fun min(a:Int,b:Int)= if(a>b) b else a
5:for循環(huán)
var args=listOf("han","tang","song")
//args 是數(shù)組日麸,下面分三種方式打印數(shù)組中的name元素
for(name in args){
println("hello,${name}")
println("hello,$name")
println("hello,"+name)
}
println("hello,$args[0]")
println("hello,${args[0]}")
for(index in args.indices){
println("name at $index is ${args[index]}")
}
var temp=args.size
while (temp>0){
println("name at ${temp-1} is ${args[temp-1]}")
temp--
}
可是為什么"hello ,args[0]"就無(wú)法打印出數(shù)組的第一個(gè)元素,而是打印了數(shù)組的地址呢代箭?
6:null 檢查
最讓人們稱道Kotlin之一的就是null check了吧墩划,如果不做null檢查,就會(huì)報(bào)錯(cuò)嗡综。當(dāng)某個(gè)變量允許為null時(shí)走诞,必須在聲明的類型后面添加一個(gè)?。
fun parseInt(temp:String ):Int?{
try{
return temp.toInt()
}catch(e:NumberFormatException){
println("here is a argument isnt Int")
}
return null
}
7:is用來(lái)做類型判斷
當(dāng)用is類型判斷之后蛤高,可以直接使用該變量蚣旱,而不再需要強(qiáng)制轉(zhuǎn)換。
if(name is String){
val tempLength=name.length
}
//或者
if(name !is String){
return null
}else{
return name.length
}
8:when取代了switch
fun describe(obj: Any): String =
when (obj) {
1 -> "One"
"Hello" -> "Greeting"
is Long -> "Long"
!is String -> "Not a string"
else -> "Unknown"
}
fun main(args: Array<String>) {
println(describe(1))
println(describe("Hello"))
println(describe(1000L))
println(describe(2))
println(describe("other"))
}
9:String字符串和 Array數(shù)組都有l(wèi)ength 屬性可以查看長(zhǎng)度戴陡。
if(name is String){
val tempLength=name.length
}
**10 官方的一個(gè)例子塞绿,比較難理解 **
(1)怎么在main方法里面,還可以定一個(gè)方法恤批?
(2) println("'{getStringLength(obj) ?: "... err, not a string"} ")這句話怎么理解异吻?
fun getStringLength(obj: Any): Int? {
if (obj is String) {
// `obj` 在該條件分支內(nèi)自動(dòng)轉(zhuǎn)換成 `String`
return obj.length
}
// 在離開(kāi)類型檢測(cè)分支后,`obj` 仍然是 `Any` 類型
return null
}
fun main(args: Array<String>) {
fun printLength(obj: Any) {
println("'$obj' string length is ${getStringLength(obj) ?: "... err, not a string"} ")
}
printLength("Incomprehensibilities")
printLength(1000)
11:區(qū)間迭代
使用 in 運(yùn)算符來(lái)檢測(cè)某個(gè)數(shù)字是否在指定區(qū)間內(nèi):
fun main(args: Array<String>) {
for (x in 1..10 step 2) {
print(x)
}
for (x in 9 downTo 0 step 3) {
print(x)
}
}
// 135799630
fun main(args: Array<String>) {
val list = listOf("a", "b", "c")
if (-1 !in 0..list.lastIndex) {
println("-1 is out of range")
}
if (list.size !in list.indices) {
println("list size is out of valid list indices range too")
}
}
//-1 is out of range
//list size is out of valid list indices range too
12:使用集合
fun main(args: Array<String>) {
val items = setOf("apple", "banana", "kiwi")
when {
"orange" in items -> println("juicy")
"apple" in items -> println("apple is fine too")
}
}
//apple is fine too
fun main(args: Array<String>) {
val fruits = listOf("banana", "avocado", "apple", "kiwi")
fruits
.filter { it.startsWith("a") }
.sortedBy { it }
.map { it.toUpperCase() }
.forEach { println(it) }
}
//APPLE
//AVOCADO
二:Kotlin在Android中的使用喜庞。
Kotlin基礎(chǔ)的學(xué)習(xí)與Android開(kāi)發(fā)的兩相結(jié)合诀浪,我感覺(jué)效率會(huì)快點(diǎn),所以呢延都,下面就試一下Kotlin在Android中的應(yīng)用雷猪。由于我的Android studio目前版本是穩(wěn)定版2.3 ,而官方的需要3.0才能支持Kotlin的使用晰房,但是我們可以在版本2.3上通過(guò)插件的形式求摇,來(lái)率先感受一下射沟。下面是安裝插件的過(guò)程,系統(tǒng)環(huán)境是Mac os与境,工作環(huán)境是Android studio 2.3验夯。
當(dāng)我們選中來(lái)Kotlin之后,就可以點(diǎn)擊右邊的Install綠色按鈕進(jìn)行安裝摔刁,安裝可能會(huì)需要0到正無(wú)窮大的時(shí)間挥转,關(guān)鍵還是看網(wǎng)速,正常取值范圍應(yīng)該在1到10分鐘之間吧共屈。安裝成功之后扁位,就可以重啟Android Studio。
重啟完成之后趁俊,就可以點(diǎn)擊項(xiàng)目包,開(kāi)始創(chuàng)建Kotlin語(yǔ)言的的Activity了刑然。
當(dāng)我們創(chuàng)建了一個(gè)KotlinActivity寺擂,那么這個(gè)項(xiàng)目,就不再是普通的Android項(xiàng)目了泼掠,而是一個(gè)擁有Kotlin的被稱作官方語(yǔ)言的項(xiàng)目了怔软。此時(shí)我們會(huì)在新建的KotlinActivity上面發(fā)現(xiàn)一個(gè)提示,要求我們配置Kotlin择镇。
當(dāng)我們點(diǎn)擊Configure配置完成Kotlin之后挡逼,就sync project同步一下項(xiàng)目。此時(shí)就會(huì)出現(xiàn)**Refreshing projectName Gradle Project **腻豌,那么我們就可以起來(lái)活動(dòng)一下家坎,倒杯水,看看窗外風(fēng)景吝梅,慢慢等待虱疏。。
花開(kāi)花落苏携,春去秋來(lái)
gradle終于更新完成做瞪。此時(shí)可以一睹KotlinActivity的芳容了。
class Main2Activity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main2)
}
}
那么到底都是什么地方出現(xiàn)了變化了呢右冻?AndroidMenifest.xml一切正常装蓬。activity_main2.xml一切正常。App的build.gradle文件中似乎發(fā)生了一些變化
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
……
compile "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"
在project的build.gradle中也發(fā)生了一些變化
buildscript {
ext.kotlin_version = '1.1.2-3'
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.3.2'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
系統(tǒng)提示編譯版本和IDE自帶的kotlin_version不一致纱扭,于是就手動(dòng)改了版本號(hào)1.1.2-4改成了1.1.2-3牍帚。然后gradle又開(kāi)始下載了。乳蛾。履羞。
花謝花開(kāi)峦萎,秋去春來(lái)
gradle更新完成之后,我們就可以在KotlinActivity中嘗試寫一下代碼了忆首。
附錄
Kotlin學(xué)習(xí)資料大全爱榔,附送學(xué)習(xí)視頻首發(fā)
一文讓你全面深入了解Kotlin,附優(yōu)秀的開(kāi)源Kotlin的Android項(xiàng)目和視頻