2017年,Kotlin的发展可谓十分迅猛,稍微关注it界的人都知道谷歌宣布kotlin成为安卓的一级语言,不过那时候我并没有关注,因为我不是搞安卓的... 哈哈开个玩笑,其实之前也有听说过这个语言的名字,但当时对我来说就真的是一个名字而已。

直到前几周我无意间看了一篇为什么我要改用XXX语言这种系列的文章,接着花了几天的时间去了解了一下之后,我突然意识到,oh my god, kotlin, 这就是我一直想要的。

用相见恨晚这个词来形容我觉得还挺贴切的,为什么呢?我喜欢函数式编程,我认为用函数式的思维去解决问题可以让复杂的问题变得十分简单,这就好像以前读小学初中做数学题有直接一步一步解决的思路,也有列方程然后求函数方程的解法,后者在描述与解决问题上十分清晰与简单,列出了方程式之后只需要求方程的解就行了。

我平常使用的语言是java,在java7时代我使用guava来进行一些少量的函数式编程(因为大量的匿名内部类真的无比难看),好在java8引入了lambda让表述清晰了很多,不过java8中的还不够。于是随着兴趣,我学习了lisp,一门超级简洁的语言,可我发现,在实际工作中的作用微乎其微,更多的是思想上的提升。我开始寻找能够切合我自身实际情况的函数式语言,于是乎很自然的就想到了jvm平台上有没有这种语言呢,果然是有的,例如Clojure和Scala,这两个前者是lisp在jvm上的方言,后者听说是强化版java,身为一个java并想着实践的人,我更倾向于scala,又是一个偶然我看到了scala实现一些经典算法的例子,大部分的实现只需要1行或者2行,着实让我惊了个呆,于是马上开始学习...可是渐渐的我发现,scala是不是有一些太复杂了,例如类型系统与各种符号组合,我再次惊了个呆。惊叹完我在想:哎还是老老实实搞java吧,为什么总是想这些有的没的呢?

对于java,我个人最喜欢的有2点,一是生态环境非常良好,开源,拥有大量而又成熟的类库,框架,解决方案并持续更新。二是我喜欢静态语言,而java是强类型的静态语言,虽然这使得你要多写很多字符,不过这样编译器会让你少犯很多低级错误,同时对于维护来说,java把语法规范的很死,大大降低了维护的难度,因为大家写的代码都是长的差不多的(在同一种编程范式下),当然你也丧失了一定程度的自由:) 与之成为鲜明对比的就是scala,scala同一种解决问题方式的写法有NNN种,并且总有你看不懂并且不怎么想看的....

扯的有点远,不过总结上文,从我个人情况来说,在我心目中对我来说最合适的语言是这样的

  • 支持函数式编程,不要求像严格函数语言那样(例如lisp,haskell),但至少要more than java
  • JVM平台上的,能够享受JVM生态资源
  • 静态语言,这样可以减少很多不必要的错误
  • 语法有自由度但不能太自由(例如scala),语法自由度应当是大于java小于scala
  • 拥有良好的生态环境与成熟解决方案,这样不用什么东西都自己造
  • 学习成本低,可以很容易的上手

我一直觉得这样的要求会不会是一种奢求,然而并不是... kotlin完美的符合我所希望的所有要求(这就是我为什么觉得相见恨晚的原因),对比上面几点,kotlin都是符合甚至超出的

  • 支持函数式编程,并且因为扩展函数的特性,可做的事比java多
  • 不仅仅是JVM平台上的语言,并且编译后的字节码就是java的字节码
  • 是静态语言
  • 语法比java简洁,但又没有像scala那么开放,例如只能重写有限的操作符,中缀函数必须声明(scala默认所有的都是)
  • 可以和java完美兼容,因此可以享受到java良好的生态环境
  • 和java代码可以互相调用与转换,本质上可以看成java的扩展版,上手十分快,熟悉java的语法一般1,2天就可以用Kotlin开发了

除此之外,kotlin还拥有

  • 强大的ide-idea的支持,不需要换ide就可以直接编写(idea目前就是Kotlin编写的)
  • java工程的转换十分容易
  • 非常棒的dsl系统
  • fun 有趣,我只能这么来形容了,就是有趣,有很多地方都值得研究,并且毫不枯燥。

我目前的工作是独立负责一块内核模块,因此我的自由度还是挺高的,于是在我花了大约一周的时间(得益于idea的自动转换,大部分时间都在重构上,因为本身就是函数式的写法所以重构也很快),将代码转换成了Kotlin版本的,过程非常流畅,运行起来的效果也丝毫没有受到影响。

所以如果你和我一样有上面的这些苦恼的话,不妨试试Kotlin,真的很不错。

Java to Kotlin (1) - 就决定是你了的更多相关文章

  1. 工厂方法模式(Java与Kotlin版)

    前文推送 设计模式 简单工厂模式(Java与Kotlin版) Kotlin基础知识 Kotlin入门第一课:从对比Java开始 Kotlin入门第二课:集合操作 Kotlin入门第三课:数据类型 初次 ...

  2. 抽象工厂模式(Java与Kotlin版)

    前文推送 设计模式 简单工厂模式(Java与Kotlin版) 工厂方法模式(Java与Kotlin版) Kotlin基础知识 Kotlin入门第一课:从对比Java开始 Kotlin入门第二课:集合操 ...

  3. 建造者模式(Java与Kotlin版)

    前文推送 设计模式 简单工厂模式(Java与Kotlin版) 工厂方法模式(Java与Kotlin版) 抽象工厂模式(Java与Kotlin版) Kotlin基础知识 Kotlin入门第一课:从对比J ...

  4. 【译】Java、Kotlin、RN、Flutter 开发出来的 App 大小,你了解过吗?

    现在开发 App 的方式非常多,原生.ReactNative.Flutter 都是不错的选择.那你有没有关注过,使用不同的方式,编译生成的 Apk ,大小是否会有什么影响呢?本文就以一个最简单的 He ...

  5. Java与Kotlin, 哪个是开发安卓应用的首选语言?

    Java是很多开发者创建安卓应用的首选语言.但它在 Android 界的领导地位正受到各种新语言的挑战,Kotlin就是其一.虽然Kotlin最近才开始受到热捧,但有为数不少的人相信 Kotlin 在 ...

  6. 简单工厂模式(Java与Kotlin版)

    Kotlin基础知识的学习,请参考之前的文章: Kotlin入门第一课:从对比Java开始 Kotlin入门第二课:集合操作 Kotlin入门第三课:数据类型 初次尝试用Kotlin实现Android ...

  7. Java调用Kotlin事项及Kotlin反射初步

    继续来研究Java调用Kotlin的一些东东. @Throws注解: 我们知道在Kotlin中是不存在checked exception的,而在Java中是存在的,那..如果从Java来调用Kotli ...

  8. Java调用Kotlin程序深度解析

    异常: 在之前我们已经学习在Kotlin中的所有异常都是运行期的,而不像Java分为运行期和非运行期,下面用代码来演示一下,先建一个Java的异常: 然后在Kotlin中来调用一下该Java中的方法 ...

  9. 深入分析 Java、Kotlin、Go 的线程和协程

    前言 协程是什么 协程的好处 进程 进程是什么 进程组成 进程特征 线程 线程是什么 线程组成 任务调度 进程与线程的区别 线程的实现模型 一对一模型 多对一模型 多对多模型 线程的"并发& ...

  10. java to kotlin (2) - lambda编程

    前言 Kotlin Note 是我学习kotlin整理笔记向博客,文章中的例子参考了kotlin in action这本书籍,同时我也极力推荐这本书,拥有Java基础的人可以很快的就使用kotlin来 ...

随机推荐

  1. 信号和槽:Qt中最差劲的创造

    不要被这个标题唬住了,实际上我是非常认可Qt的.在C++实现的开源产品中没有哪一个的API风格比得上Qt,拥有高度一致性,符合常识,符合直觉,几乎不用学就可以直接上手.或许是由于我们摆脱不了马太效应的 ...

  2. Java学习第十九天

    1:异常(理解) (1)程序出现的不正常的情况. (2)异常的体系 Throwable |--Error 严重问题,我们不处理. |--Exception |--RuntimeException 运行 ...

  3. MySQL 查询多张表中相同字段的最大值

    MySql : 有N张表,N未知,每张表都有一个字段(id),每张表的字段结构不完全一样,如何查询所有表里面所有id的最大值?如下图所示: 对上面三张表进行操作的话,结果应该为:9 SQL语句: se ...

  4. android aidl通信 RemoteCallbackList客户端注册回调

    RemoteCallbackList 声明 public class RemoteCallbackList<E extends IInterface> 情况 在AIDL中客户端向服务端注册 ...

  5. vs.net打包(自动检测环境并安装.net framwork)

    vs.net打包程序或者制作安装程序时自动检测环境并安装.netframwork的设置方法之前我看过文档也做过,但是过一段时间又忘了,现在终于又找到方法了,还是把这个方法写下来吧,方便自己也方便大家将 ...

  6. Linux 套接字编程 - TCP连接基础

    第五章的内容,实现一个echo服务器和对应的客户端,主要收获: 0. TCP socket编程主要基本步骤 1. SIGCHLD信号含义(子进程退出时向父进程发送,提醒父进程对其状态信息进行一个获取) ...

  7. java常用API之字符串缓冲区

    StringBuffer类: StringBuffer是个字符串的缓冲区,是可变的字符串数组,即就是它是一个容器,容器中可以装很多字符串.并且能够对其中的字符串进行各种操作 StringBuffer的 ...

  8. 从零开始的全栈工程师——PHP篇 ( 单词汇总 ) ( php解决文字乱码 )

    解决乱码: header("Content-Type: text/html;charset=utf-8"); 单词 局部的: local 全局的: global 静态的: stat ...

  9. SQL 出现18456

    SQL Server 2008R2 18456错误解决方案   SQL Server 2008R2 18456错误解决方案 微软解释说,因密码或用户名错误而使身份验证失败并导致连接尝试被拒时,类似下面 ...

  10. ExecutorService的invokeAny方法

    一.此方法获得最先完成任务的结果,即Callable<T>接口中的call的返回值,在获得结果时,会中断其他正在执行的任务 示例代码: import java.util.ArrayList ...