kotlin一点摸索

来源:互联网 发布:淘宝蒙娜丽莎十字绣 编辑:程序博客网 时间:2024/05/22 17:06

关于kotlin

缘起-为什么写这篇博客

之前并未对kotlin这个语言有过了解(毕竟在上刘钦老师的课前没有写过安卓应用),最早看到这个名字,还是5月份知乎的timeline上看到相关问题如何看待 Kotlin 成为 Google 正式支持的 Android 开发一级编程语言?
“在5月17日(北京时间5月18日凌晨)的Google I/O 2017 Keynote上, 谷歌宣布,将Kotlin语言作为安卓开发的一级编程语言……Kotlin由JetBrains公司开发,与Java 100%互通,并具备诸多Java尚不支持的新特性。“
当时匆匆浏览了各路大V的答案,只感觉加州甲骨文律师所招了不少怨(笑),不仅有程序员对java语法颇有微词,也惹得谷歌寻求jetbrain的合作。
而后刘老师便发布了博客作业的DDL,此时不了解kotlin,更待何时?

初探kotlin-与java的对比

作为一个懒人,了解kotlin的第一步并没有去直接看Basic Syntax - Kotlin Programming Language,而是选择From Java to Kotlin。直接复制文档内容过于敷衍,也很无趣,我列举一下自己的感受:

  1. 没有类型声明,变量统一只用val声明,具体类型由赋值的类型决定,不过,当没有赋值时,就必须声明类型了,这样的设计稍比java复杂,但是减少了码农的一点负担。
  2. 相比于java,对null的处理更为优秀。在阅读java与kotlin的对比时,我只是觉得kotlin利用符号?或者!!来进行null检查更为简洁,而在阅读了Kotlin 作为 Android 开发语言相比传统 Java 有什么优势? - 回答作者: 覃超这个答案后,才进一步理解了kotlin为什么这样设计,简单的说,在检查和处理 nullable 变量的时候,Kotlin 更加有效。

  3. 由于第二条的原因,在 java中的三元运算d=(a?b:c)在kotlin里只能换一种方式实现,即

val text = if (x > 5)              "x > 5"            else "x <= 5"

简言之变成了一种特别的条件语句-虽然这就是这种三元运算的原本含义。个人感觉比较啰嗦。
4. 位运算符没有使用传统的&、|或者》,而是英文简写,如and、or或shr,由于我对kotlin的了解还不够深,暂时还不知道省下来的这些符号用在何处。
5. 使用更易理解的语法,比如 is 取代 instanceof,用as取代类型转换

String text = (String) other;//这是javaval text = other as String//这是kotlin

用下面这种方式描述区间

if(x >= 0 && x <= 10 ){}//这是javaif (x in 0..10) { }//这是kotlin

6.相比于java,有更智能的类型转换

if(a instanceof String){  final String result = ((String) a).substring(1);}//这是javaif (a is String) {  val result = a.substring(1)}//这是kotlin

7.效率远超switch的when语句
这是网上找到的代码例子:

fun testWhen(int: Int) {    when(int) {        in 10 .. Int.MAX_VALUE -> println("${int} 太大了我懒得算")        2, 3, 5, 7 -> println("${int} 是质数")        else -> println("${int} 不是质数")    }}fun main(args: Array<String>) {    (0..10).forEach { testWhen(it) }}
输出如下:0 不是质数1 不是质数2 是质数3 是质数4 不是质数5 是质数6 不是质数7 是质数8 不是质数9 不是质数10 太大了我懒得算

和 JAVA 中死板的 switch-case 语句不同,在 when 中,我们既可以用参数去匹配 10 到 Int.MAX_VALUE 的区间,也可以去匹配 2, 3, 5, 7 这一组值,当然我这里没有列举所有特性。when 的灵活、简洁,使得我们在使用它的时候变得相当轻松(和 JAVA 的 switch 对比的话)

总的来说,kotlin与java相似却又不同的地方还有很多,在此就不赘述了,以免有凑字数嫌疑。

其他零零碎碎的东西

比如,对于kotlin的空值安全,有人认为String 和 String?是两种不同的类型。String 已经确定是不会为空,一定有值;而 String?则是未知的,也许有值,也许是空。在使用对象的属性和方法的时候,String 类型的对象可以毫无顾忌的直接使用,而 String?类型需要你先做非空判断。
“两种不同类型“的认识似乎有点极端,不过暂时没有找到能反驳的理由。

原创粉丝点击