自从看到谷歌在Google I/O2017开发者大会上,将kotlin作为android的官方开发语言后,kotlin的曝光率真的是越来越高了,作为一枚小小的android开发者,真的是已经到了不能忽略kotlin的底部了,于是决定简单的学学kotlin语言,然后就来写android项目了,所以这里的简单总结,真的是很简单。
1、kotlin使用知识总结
由于kotlin作为一门独立的语言,肯定不是一篇博客就能够讲清楚的,这里只是简单点额来总结总结,希望看完这篇文章后,能够对kotlin使用有一个大致的认识。
1.1、变量定义
var name: String? = null
代码中var表示name是一个变量,“:”后的String来定义变量name数据类型是String,“?”表示变量name是可以为空的,最后=null将变量初始化为一个空字符串。这里提示下kotlin中不需要分号来分割语句,换行就标示语句的结束(当然现在写分号也不会报错)。
1.2、常量定义
val name: String = "yoryky"
这里可以看出,常量定义使用val关键字来定义,定义格式和变量定义基本相同,但是由于常量可以根据值来推断数据类型,所以常量的定义可以省略数据类型。
val name = "yoryky"
1.3、函数定义
fun funName(param1:String,param2: Int):String{
}
通过fun关键字来来声明funName是一个方法,()中添加方法的参数,:Stirng表示方法返回String类型字符串。
kotlin中的构造函数和java构造函数很大不同,构造函数的使用这里用下面的图来说明
kotlin中的构造函数分为主构造函数以及次构造函数,主构造函数只有一个,次构造函数可以多个,图中的主构造函数表现为MainPresenterImpl括号中的内容,实际上是下面代码的缩写
class MainPresenterImpl public constructor(name:String): MainPresenter
次构造函数必须继承主构造函数,这个在上图中有说明,主构造函数和次构造函数都是以constructor关键字来标示。
注意到这里还有一个init关键字,其中可进行一些基于主构造函数参数的初始化操作(主构造函数体中不能包含任何代码),如这里的赋值操作。
1.4、类的属性
kotlin中声明好属性后,不需要去实现对应的get/set方法,在类的实例中也是通过instance.propertyName的方式来获取属性值(虽然实际上还是通过get/set方法获取的,但是这个我们不用管)。
class User {
var name: String? = null;
var age: Int? = null;
}
定义对象以及其属性,注意这里没有定义get/set方法
var user = User();
user.name = "yoryky"
user.age = 12
var age = user.age
print("name:${user.name}")
print("age:$age")
使用时,可以看到也是直接操作对象的属性,这里用到 符号来表示字符串模板,这里就一起说了吧 符号可以直接将变量嵌入和字符串中,简单的变量直接使用 符号,复杂点的(有表达式的)使用 {}将变量嵌入到字符串中。
1.5、条件语句
kotlin中if/else的使用方式同java保持一致,但是用when替代了switch语句。when比switch语句强大的多
,它不仅可以接受变量、常量、表达式等作为参数。
var result:String? = "yoryky"
when(result){
"kobe" -> println("输入的是kobe")
"james"-> println("输入的是james")
"yoryky"-> println("输入的是yoryky")
}
这里只是列举了when的一个简单用法,when的用法很灵活,感兴趣的同学可以看看这篇文章Kotlin中when表达式的使用:超强的switch(KAD 13)。
1.6、循环语句
kotlin中还是使用while/do while语句,这和java中的使用方法基本一致,但是for语句的使用有了很大改变,类似于c#中的foreach方法
var list: ArrayList<String> = ArrayList()
list.add("item1")
list.add("item2")
for (item in list){
println(item)
}
这里列举的也就是for语句的一种基本用法,for语句还有很多的花式用法,感兴趣的童鞋可以去五分钟学会 Kotlin 语法这篇文章看看。
1.7、冒号的使用
前面其实有不少地方用到了冒号,在kotlin语法中,冒号可以说是作用很大的
常量变量类型声明、函数返回类型、类的继承都需要使用冒号,除此之外使用java类时也需要使用冒号,如下面android开发者很熟悉的代码
var intentInstance:Intent = Intent(this,MainActivity::class.java)
由于实例化类型确定,上面代码可以简化为
var intentInstance = Intent(this,MainActivity::class.java)
1.8、@符号的使用
@符号在kotlin中作用也很大,因为kotlin中经常使用内部匿名类,lambda表达式等
class User {
inner class State{
fun getUser(): User{
//返回User
return this@User
}
fun getState(): State{
//返回State
return this@State
}
}
}
这里举了一个内部类的例子,this后跟@符号标明this指定的数据类型,实际上java中也存在内部类的情况,但是可以在内部类中返回具体的对象实例来解决这个问题,这里使用了this结合@符号的方式,现在还不知道这种方式有什么好处,总之先记着有这种用法吧。
viewInstance.setOnKeyListener(View.OnKeyListener { v, keyCode, event ->
Log.e("tag", "keyCode$keyCode, ${event.keyCode}")
if (event.keyCode == KeyEvent.KEYCODE_BACK){
return@OnKeyListener true
}else{
return@OnKeyListener false
}
})
这个例子说明了kotlin中lambda表达式中的return@的用法,指明返回值是返回到OnKeyListener内部方法,根据java对应代码
view.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
return true;
}
});
这里实际上是返回OnKeyListener的onKey方法的返回值。
1.9、代码书写简化
上面举了协议例子,可能细心的童鞋都能够看到kotlin代码书写比java简化了不少,目前我是发现了三点代码简化的方式。
a、不使用new关键字
我想这个代码书写简化本来应该放在前面一点讲的,不然很多童鞋肯定看前面的代码,在实例化对象的时候都没哟使用new关键字,真可能一头雾水。但是由于本人太懒,不想重复举例,所以就放到这里了,我们只需要知道kotlin语法中在实例化对象时不需要使用new关键字就行了。
b、省略掉了语句结尾的”;”
kotlin中省略掉分号而用换行表示代码结尾,也不知道是好是坏,反正我现在写kotlin的时候,现在还是爱不由的一行代码结束时打上分号表示结尾,也不会提示错误,但是最好还是不要写分号了吧。
c、使用lambda表达式
lambda表达式是一种在多种语言中都有使用的代码简化书写方式,实际上可以粗略的理解为接口名、方法名、参数类型省掉不写,并使用->这个符号来表示参数名(符号左侧)和代码逻辑(符号右侧)。
kotlin中使用lambda表达式有以下几种类型
// 无参数无返回值
Thread(Runnable {
sleep(1000)
}).start()
// 单参数不带返回值
view.setOnClickListener { v ->
Log.e("tag", "${v.tag}")
}
// 多参数带返回值
view.setOnKeyListener(View.OnKeyListener { v, keyCode, event ->
Log.e("tag", "keyCode$keyCode, ${event.keyCode}")
if (event.keyCode == KeyEvent.KEYCODE_BACK){
return@OnKeyListener true
}else{
return@OnKeyListener false
}
})
看到这里,再去看前面的代码,是不是清晰很多了呢。kotlin中代码简化方式感觉还比较多,这里的三种方式决不是全部。
1.10、延迟加载
通过将by lazy关键字作用在常量上,会在第一次调用常量的时候初始化,并将最后一行作为返回值,以后再调用该常量是都不再执行最后一行之前的代码。
val lazyValue: String by lazy {
println("computed!")
"Hello"
}
fun main(args: Array<String>) {
println(lazyValue)
println(lazyValue)
}
执行main方法后输出为
/* 输出:
* computed
* Hello
* Hello
*/
所以能够看出,lazyValue两次调用都输出了最后一行,第一次调用的时候执行了最后一行之前的代码,第二次执行就直接输出了最后一行,所以看得出来延迟加载可以被叫做懒加载,而且是真的懒。
到这里就将目前遇到的kotlin知识总结完毕,相信懂了这些知识后,可以愉快的去进行android开发了。
2、参考文献
这里还是得感谢那些先吃螃蟹的同学,把参考文献也一起列举出来吧