美文网首页
震惊!Java平台上还可以这样写代码,99%的程序员都不知道

震惊!Java平台上还可以这样写代码,99%的程序员都不知道

作者: 22790fe4fb44 | 来源:发表于2017-04-28 22:05 被阅读0次

这篇文章的目的是,在公司里推广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的优点是,它的类型身娇腰柔易推倒,啊呸,推导。

推倒.jpg
val 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提供使用者和语言本身交互的能力,通过定制某些细节,写出具有简洁而强大的表现力的代码。

相关文章

网友评论

      本文标题:震惊!Java平台上还可以这样写代码,99%的程序员都不知道

      本文链接:https://www.haomeiwen.com/subject/zthazttx.html