这篇文章的目的是,在公司里推广Kotlin,着重介绍Kotlin的有趣和强大的特性。
Kotlin是什么
Kotlin是JetBrains公司推出的JVM的一种新的语言,Intellij IDEA就是JetBrains公司的著名产品。它是一门“实用的”函数式编程语言,具有很好的和Java互操作性。很多人认为Kotlin是Android平台上的Swift。Swift则是苹果官方推出来用于代替Object C的“实用的”函数式编程语言。
学习和使用Kotlin背后的动机是,在Java平台上有了稳定和成熟的各种框架,以及我们自己的代码库的情况下,Kotlin可以作为一个提高代码安全,以及团队编程效率的工具。另外,它还更有趣一些。
常量和变量
var i: Int = 0
val j: Int = 0
i = 1
j = 1 //编译错误,不能修改常量j的值
类的属性也有常量和变量之分
class Account {
val name: String = "测试"
var email: String = "test@hotmail.com"
}
val account = Account()
println("用户名是${account.name}, 邮箱地址是${account.email}")
account.email = "test@qq.com"
可选值
image.png和Java不同的是,Kotlin区分可为空的取值和不可为空的取值。如果一个变量可为空,那么通过?
来表示,这是一个可选值(Optional)。在使用可为空的变量的值的时候,编译器强制进行安全检查,也就是要求使用?
放在语句之前,如果该变量为空,那么不执行语句。并且,如果执行了检查,那么编译器就会认为该变量不会为空,而允许省略?
来调用。
var 黑人: Int? = null
黑人?.plus(1)
if(黑人 != null) 黑人.plus(1)
对函数参数是否为可选值的约定
image.png如果一个函数的参数可以为null,那么就使用可选值来表示,如果它不应该为null,那么就不使用可选值。我们称之为文法式约定
,编译器会帮助我们检查这样的约定是否有被遵守。
fun addAccountWithEmail(name: String, email: String) {
//do something
}
fun addAccount(name: String, email: String?) {
//do something
}
addAccount(name, email)
addAccount(name, email2)
//addAccountWithEmail(name, email) 编译错误, 参数email不是可选值
//addAccount(name, email!!) 不要滥用!!
addAccountWithEmail(name, email2)
email?.let { addAccountWithEmail(name, email) }
}
智能类型转换
在对类型进行了检查之后,Kotlin将自动为你执行类型转换,在你编写代码的时候还可以自动补全。
class TextView : View() {
var text: String? = null
}
class ImageView : View() {
var image: Image? = null
}
val view: View = ImageView()
if (view is ImageView) {
view.image = Image("/sdcard/test.png")
} else if (view is TextView) {
view.text = "test"
}
匿名类型
熟悉JavaScript的朋友,知道JavaScript的类型是动态的,一个object可以动态的添加属性和方法,Kotlin的object expression支持这种特性。
val testAccount = object {
val name = "测试"
var email: String = "test@hotmail.com"
fun log() {
println("用户名是$name, 邮箱地址是$email")
}
}
testAccount.log()
testAccount.email = "test@qq.com"
我们可以用这个特性来更好的支持Java的匿名类型。
类型推导
Kotlin的优点是,它的类型身娇腰柔易推倒,啊呸,推导。
推倒.jpgval i: Int = 0
val j = 0
函数的类型也可以推导:
fun add(a: Int, b: Int): Int {
return a + b
}
fun add1(a: Int, b: Int) = {
a + b
}
Kotlin风格
黑人?.let { 黑人.plus(1) }
fun add2(a: Int, b: Int) = a + b
when(view) {
is ImageView -> view.image = Image("/sdcard/test.png")
is TextView -> view.text = "test"
}
设计模式
应该说,设计模式和Java是一同兴起的,许多讲设计模式的书是以Java作为示例的。我们将审视这些设计模式在Kotlin中的情况,它们要么被语言吸收,要么在实现上的细节略有不同。
适配器模式
在Java平台上令人诟病的读取文件的API接口,是使用适配器模式的一个例子。使用extension方法,我们可以用一种简洁得多的方式来实现适配器模式。
val filePath = "data.txt"
val fis = FileInputStream(filePath)
val reader = InputStreamReader(fis)
val bufferedReader = BufferedReader(reader)
val bufferedReader2 = FileInputStream(filePath).bufferedReader()
To be Continued...
和Java互操作性
Java的类型,在Kotlin一般是以T!表示的。
类默认是final的
Kotlin标准库
操作符重载
Kotlin提供使用者和语言本身交互的能力,通过定制某些细节,写出具有简洁而强大的表现力的代码。
网友评论