Google在2017的IO大会上宣布将Kotlin作为Android开发的官方语言。这一重磅消息,以春风又绿江南岸之势,迅速夺取了大多数Android开发人员的眼球。那么就让我们以热烈的歌声欢迎已经七岁的Kotlin登场(鼓掌)。
Kotlin不思议
突然地想念你
彩绘玻璃前的身影
只有孤单变浓郁
Kotlin不思议
突然那么想念你
我带着爱抒情的远行
--《马德里》(有删改)
老规矩,先奉上Kotlin官方网站和中文网站,以备查阅。其余的资料汇总,会在文章末尾附送,资料之多,乱花渐欲迷人眼。由于是初次接触Kotlin,错误再所难免,欢迎留言指正批评。
一:Kotlin基本语法
1:定义函数
(1):这里定义了一个两个整数之间的乘法的函数,Int注意首字母要大写,而且在返回值对应的类型,应该写在大括号的前面,而不是紧跟fun之后。
fun mul(a:Int,b:Int):Int{
return a*b;
}
(2):上面只是一种写法,还有另外一种返回值类型自动推断的用法
fun mul(a:Int,b:Int)=a*b
(3):当我们不需要函数返回值时,可以用Unit
fun mul(a:Int,b:Int):Unit{
println("kotlin绵绵无期")
}
(4) :Unit 还可以省略,于是就出现了这种和自动推动有些像的写法
fun mul(a:Int,b:Int) {
println("长恨kotlin非我有")
}
2:定义局部变量
(1):下面这种定义的属于常量,只读,不可以修改,使用了关键字val。
val kot:Int = 5 //立即赋值
val lin=2 // 推断赋值
val love:Int // 如果没有明确赋值,那么类型就不可以省略
love=520 // 然后再单独给她赋值
(2):下面这种定义属于变量,使用关键字var
var you =5 //自动推断出类型
you+=520
3:字符串模版
var love=520
val temp1="love is $love"
love=525
var temp2="${temp1.replace("is","was")},but now is $love"
上面的这段代码temp2这个字符串实际上就是"love was 520,but now is 525".这里的love被赋值了两次,第一次是520,第二次是525.
4:三元操作符没有,可以用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循环
var args=listOf("han","tang","song")
//args 是数组,下面分三种方式打印数组中的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]"就无法打印出数组的第一个元素,而是打印了数组的地址呢?
6:null 检查
最让人们称道Kotlin之一的就是null check了吧,如果不做null检查,就会报错。当某个变量允许为null时,必须在声明的类型后面添加一个?。
fun parseInt(temp:String ):Int?{
try{
return temp.toInt()
}catch(e:NumberFormatException){
println("here is a argument isnt Int")
}
return null
}
7:is用来做类型判断
当用is类型判断之后,可以直接使用该变量,而不再需要强制转换。
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数组都有length 属性可以查看长度。
if(name is String){
val tempLength=name.length
}
**10 官方的一个例子,比较难理解 **
(1)怎么在main方法里面,还可以定一个方法?
(2) println("'{getStringLength(obj) ?: "... err, not a string"} ")这句话怎么理解?
fun getStringLength(obj: Any): Int? {
if (obj is String) {
// `obj` 在该条件分支内自动转换成 `String`
return obj.length
}
// 在离开类型检测分支后,`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:区间迭代
使用 in 运算符来检测某个数字是否在指定区间内:
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基础的学习与Android开发的两相结合,我感觉效率会快点,所以呢,下面就试一下Kotlin在Android中的应用。由于我的Android studio目前版本是稳定版2.3 ,而官方的需要3.0才能支持Kotlin的使用,但是我们可以在版本2.3上通过插件的形式,来率先感受一下。下面是安装插件的过程,系统环境是Mac os,工作环境是Android studio 2.3。
当我们选中来Kotlin之后,就可以点击右边的Install绿色按钮进行安装,安装可能会需要0到正无穷大的时间,关键还是看网速,正常取值范围应该在1到10分钟之间吧。安装成功之后,就可以重启Android Studio。
重启完成之后,就可以点击项目包,开始创建Kotlin语言的的Activity了。
当我们创建了一个KotlinActivity,那么这个项目,就不再是普通的Android项目了,而是一个拥有Kotlin的被称作官方语言的项目了。此时我们会在新建的KotlinActivity上面发现一个提示,要求我们配置Kotlin。
当我们点击Configure配置完成Kotlin之后,就sync project同步一下项目。此时就会出现**Refreshing projectName Gradle Project **,那么我们就可以起来活动一下,倒杯水,看看窗外风景,慢慢等待。。
花开花落,春去秋来
gradle终于更新完成。此时可以一睹KotlinActivity的芳容了。
class Main2Activity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main2)
}
}
那么到底都是什么地方出现了变化了呢?AndroidMenifest.xml一切正常。activity_main2.xml一切正常。App的build.gradle文件中似乎发生了一些变化
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
……
compile "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"
在project的build.gradle中也发生了一些变化
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
}
}
系统提示编译版本和IDE自带的kotlin_version不一致,于是就手动改了版本号1.1.2-4改成了1.1.2-3。然后gradle又开始下载了。。。
花谢花开,秋去春来
gradle更新完成之后,我们就可以在KotlinActivity中尝试写一下代码了。
附录
Kotlin学习资料大全,附送学习视频首发
一文让你全面深入了解Kotlin,附优秀的开源Kotlin的Android项目和视频