想统计出某个项目产品中所有文件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)。
还可以作为一门脚本语言,其类型安全、简洁语法能提高开发效率,其运行性能高于绝大多数脚本语言。
它可以运行在下面任一种的环境下:
安卓设备。目前安卓是Kotlin最热门的应用领域,Google已经将Kotlin定义为除了Java外唯一的Android的一级开发语言。Kotlin可以编译成安卓Java字节码运行。使用Kotlin编写Android可以大大提高开发效率、降低出错风险。
标准的Java虚拟机(JVM)。Kotlin编译成标准Java字节码,作为服务器后端开发语言、以及桌面应用。
Web浏览器。Kotlin可以编译成JavaScript代码运行于Web浏览器上,作为Web前端语言。
本地原生应用。向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
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等。
Eclipse支持比较差,建议不使用。
(1)比如只有两个重构方法,而且还有bug:rename有时还不成功。
(2)没有Call Hierarchy,不好追踪调用链
(3)没有Type Hierarchy,不好分析类间关系
(4)Find Reference 有bug,有时找到的引用点打不开,打开class文件而不是源码kt文件,说找不到源码(即使源码就是当前文件)
——- 本博客所有内容均为原创,转载请注明作者和出处 ——-
作者:刘文哲
联系方式:[email protected]
博客:http://blog.csdn.net/liuwenzhe2008