Kotlin的诱人特性

引子

想统计出某个项目产品中所有文件Java源代码的总行数,写个Kotlin脚本很简单,只需 3 行代码搞定:

import java.nio.file.Paths
import java.nio.file.Files

Files.walk(Paths.get(args[0])).filter {
  it.toFile().extension == "java"
}.flatMap(Files::lines).count().let(::println)

保存为文件:CountCode.kts,运行下:

kotlinc -script CountCode.kts C:\Users\weliu\code

屏幕打印出结果:

4038

熟悉Java的同学会说:这不就是Java吗?对的,上面的Kotlin代码使用的都是Java标准库。从某种意义上,Kotlin就是Java的超级版。

它像Scala一样编译成Java字节码,所有Java库都可以直接拿来就用,继承了Java多年积累的财富和技术栈,Java开发人员可以不必抛弃已有积累就可以使用Kotlin最现代化的语言特性,而且学习成本很低。

Kotlin站在巨人的肩膀上,将Java多年开发得出的”最佳实践“,融入到了Kotlin的语言特性上,从而减少犯错误的风险,提高可维护性。

同时,Kotlin提供众多语法糖以及为Java标准库扩展了众多实用方法,提高开发效率和可读性,让开发者专注于业务而无需重造车轮。

但是,从另一种意义上,Kotlin又不是Java,可以不需要JVM。

既可以像`C/C++/Go`一样编译成机器码直接运行;

也可以像`TypeScript`一样编译成`JavaScript`运行于Web浏览器;

还可以像`Perl/Python/Groovy`一样作为脚本运行,不仅运行效率更高、而且开发效率也更高、同时还能保证类型安全。例如前面写的脚本。

简介

Kotlin是一门“多范式”、“全栈式”语言

多范式

纯面向对象,一切皆对象,不像Java还存在着非对象的基本类型。

函数式编程,拥有众多函数式编程特性,如高阶函数、尾递归优化、科里化、偏函数,等等。

DSL宿主语言,可以用Kotlin创建出各自与具体领域相关的领域特定语言(DSL),比如用Kotlin可以创建出的类型安全的Gradle。

静态强类型语言,类型安全,IDE支持非常好(IDEA中的支持仅次于Java)。

还可以作为一门脚本语言,其类型安全、简洁语法能提高开发效率,其运行性能高于绝大多数脚本语言。

全栈式

它可以运行在下面任一种的环境下:

  1. 安卓设备。目前安卓是Kotlin最热门的应用领域,Google已经将Kotlin定义为除了Java外唯一的Android的一级开发语言。Kotlin可以编译成安卓Java字节码运行。使用Kotlin编写Android可以大大提高开发效率、降低出错风险。

  2. 标准的Java虚拟机(JVM)。Kotlin编译成标准Java字节码,作为服务器后端开发语言、以及桌面应用。

  3. Web浏览器。Kotlin可以编译成JavaScript代码运行于Web浏览器上,作为Web前端语言。

  4. 本地原生应用。向C语言一样,Kotlin可以编译成与机器相关的本地原生的机器码,应用于对性能有较高要求的场合。

诱人特性

Kotlin有很多Java没有的、特别有诱惑力的特性:

模板字符串和多行字符串:再也不用写那种低可读性的字符串拼接代码了!
http://kotlinlang.org/docs/reference/basic-types.html#string-templates

面向表达式编程:
(1)条件语句可以有返回值:
http://kotlinlang.org/docs/reference/control-flow.html#if-expression

(2)when:更强大的switch
http://kotlinlang.org/docs/reference/control-flow.html#when-expression

(3)函数 = 表达式
http://kotlinlang.org/docs/reference/functions.html#single-expression-functions

智能的类型转换:聪明!
http://kotlinlang.org/docs/reference/typecasts.html

空安全:语法上根除带来数十亿损失的空指针异常
http://kotlinlang.org/docs/reference/null-safety.html

提倡不可变:不可变天生线程安全、易于维护
val (相对于Java的final)
不可变集合 (虽然编译为Java的集合,但在Kotlin中却没有能修改的方法,神奇!)
http://kotlinlang.org/docs/reference/collections.html

尾递归优化:鱼(运行效率)和熊掌(开发效率)可以兼得
http://kotlinlang.org/docs/reference/functions.html#tail-recursive-functions

数据类:简单到极致,再见吧 Java Bean
https://kotlinlang.org/docs/reference/data-classes.html

解构声明:把类的属性解剖出来,实现多返回值。
http://kotlinlang.org/docs/reference/multi-declarations.html

嵌套类:缺省静态内部类
https://kotlinlang.org/docs/reference/nested-classes.html

object表达式:语法支持的单例模式,匿名类可以有实现多个接口(Java做不到),伴生对象
https://kotlinlang.org/docs/reference/object-declarations.html

扩展方法:在不更改别人库的条件下实现轻松扩展的神奇魔法!比如:“2.seconds“。这是我认为的最好的特性,Kotlin为Java类库添加了很多简单好用的方法,告别工具类。
https://kotlinlang.org/docs/reference/extensions.html

类代理:雇个人来干活挺好的 ^_^
https://kotlinlang.org/docs/reference/delegation.html

属性代理:让属性沦为傀儡,成就神奇的lazy、数据绑定等魔法!
https://kotlinlang.org/docs/reference/delegated-properties.html

内联:更优雅地使用泛型参数
http://kotlinlang.org/docs/reference/inline-functions.html#reified-type-parameters

类型安全的DSL:说人话,用自然语言描述世界!
比如:Kotlin DSL for JavaFX: https://github.com/edvin/tornadofx

协程:用同步逻辑编写异步代码,简化多核开发
http://kotlinlang.org/docs/reference/coroutines.html

与Java无缝集成:Kotlin就是Java!
Kotlin使用Java的类型系统,可以允许于JVM之上,与Java无缝集成,甚至都可以看作一个超级版的Java。
Kotlin调用Java:
http://kotlinlang.org/docs/reference/java-interop.html
Java调用Kotlin:
http://kotlinlang.org/docs/reference/java-to-kotlin-interop.html
插件:allopen,noarg
https://kotlinlang.org/docs/reference/compiler-plugins.html

开发工具

1. IntelliJ IDEA / Android Studio

JetBrain对自家的语言Kotlin当然提供最好的支持,包括:
(1) IDE自带,不需要安装插件
(2) 提供多种重构方法
这里写图片描述
(3) 可以将Java代码转换成Kotlin代码。有两种方式,第一种是把Java代码复制到Kotlin文件中,IDEA会提示是否转换为Kotlin代码:
这里写图片描述

这里写图片描述

第二种方式是把整个Java代码文件直接转换为Kotlin代码文件:
这里写图片描述

(4) 可以看到Kotlin代码编译后的字节码,以及等价的Java代码:

这里写图片描述

编译后的字节码:

这里写图片描述

字节码反编译后等价的Java代码:

这里写图片描述

通过看字节码和反编译等价的Java代码,很容易理解Kotlin原理。

(5)多种代码分析方法,如分析Call Hierachy,Type Hierachy等。

这里写图片描述

2. Eclipse

Eclipse支持比较差,建议不使用。
(1)比如只有两个重构方法,而且还有bug:rename有时还不成功。

这里写图片描述

(2)没有Call Hierarchy,不好追踪调用链
(3)没有Type Hierarchy,不好分析类间关系
(4)Find Reference 有bug,有时找到的引用点打不开,打开class文件而不是源码kt文件,说找不到源码(即使源码就是当前文件)

——- 本博客所有内容均为原创,转载请注明作者和出处 ——-

作者:刘文哲

联系方式:liuwenzhe2008@qq.com

博客:http://blog.csdn.net/liuwenzhe2008

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值