说说一类程序员在Kotlin之前没有经历过的事情。看了几篇耸人听闻的博文,我也对他们冷嘲热讽。以Kotlin为例,有人写了几篇类似《WhydidIgobacktojavafromkotlin》的博文批评kotlin。如果你有时间阅读这些热门博文,何不看看AndroidDeveloper官网上的所有示例代码,其中kotlin版本在前,java版本在后?争论语言和框架的优缺点是没有意义的。很多程序员总是赞美自己一直在使用的语言和框架,而贬低其他语言和框架。很明显,这样的程序员太狭隘了。Java确实常年流行,难道其他语言就没有意义了吗?当然不是,就算是批评,也要亲身体验过才有资格。这不是复制你所做的,毕竟对于一个真正的程序员来说,学习一门新语言是很容易的。Kotlin简洁的语法给我的感觉就是针对Java的所有痛点做出改变,比如繁琐的语法,烦人的空指针,缺乏函数式编程支持(Java8支持Lambda表达式,但还远远不够),等等。与它的孪生兄弟Scala的奔放不同,Kotlin给我的印象是聪明内敛。对于Java程序员来说,上手半天就够了,不像Scala门槛高。Java语言是我接触过的语言中语法最繁琐的(如果比较繁琐请告知)。这种繁琐可以体现在main函数上,Java也可能是唯一一个几乎用不上IDE的语言。没有IDE的语法警告和代码生成模板,其他语言勉强能写。您是否尝试过Java代码?但是Java严谨繁琐的语法恰恰是Java如此受欢迎的原因。没写过Java的人可能看不懂这句话。人们不满足于Java严格的语法,不得不加入check-style、findbugs,以及XXX公司Java代码规范的各种规章制度。最终的结果是所有Java程序员编写的代码都可以相互理解交互。即使是刚刚毕业的Java程序员,只要熟悉Java面向对象的语法,几乎没有看不懂其他Java代码的情况(业务除外)。这保证了Java程序员的代码下限非常高,可以保证大型项目的成功。看来Java有点过分了。接触过Kotlin后,你会发现Kotlin在极大简化Java代码的同时,尽可能保持与Java一样的语法严谨性,写起来非常爽。//快速创建Bean类dataclassPerson(valid:Long,varname:String,varage:Int)funmain(){//创建实例valzhangsan=Person(0L,"zhangsan",23)//设置/获取方法zhangsan.age=24valname=zhangsan.name//复制方法vallisi=zhangsan.copy(id=1,name="lisi")//默认生成tostring和equals/hashcode方法,可以改写zhangsan.toString()zhangsan.hashCode()varisEqual=zhangsan.equals(lisi)}简洁的语法无处不在。比如上面的Bean类,如果是用java写的,至少要多出几倍的代码。单例模式只需要将类替换为对象即可。虽然这些可以用JavaIDE的各种模板生成工具秒级生成,但还是用kotlin写起来舒服一些。我想强调的是,Kotlin并没有盲目地使用语法糖和新关键字来精简语法。我们可以明显感觉到,Kotlin在设计过程中尽量保证其语法的严谨性。空指针Java的空指针异常被称为“BillionDollarMistake”。在我之前的公司,为了避免空指针异常,代码规范要求几乎所有的对象都进行空判断。对于那些嵌套很深的JSON对象,判断null真的又臭又长。valname:String?//我想在这里吐槽一下为什么kotlin中没有三元运算符?name=if(Random.nextBoolean())"Ann"elsenull//加上?只有当name不为null时才会调用,而且获取到的len1类型也有一个问号,即Int?,没有问号vallen2=name?.length?:0//加双感叹号其实是java中什么都不写的方法。如果为null,则会报空指针异常。vallen3=name!!.length上面的代码解释了可能为空的对象的三种处理方式。事实上,我将Kotlin对空指针的处理归类为为所有对象添加一个泛型类型——符号?。对于带有?的对象,表示它可能为空。空指针试图在编译期间终止。这个想法真的很简单,也很巧妙。很多人一听到Kotlin就说没有空指针,但是没用过不知道怎么实现。现在面试官再问你,你知道怎么回答吗?函数式编程funAppCompatActivity.setupActionBar(@IdRestoolbarId:Int,action:ActionBar.()->Unit){valtoolbar=findViewById
