kotlin 学习笔记 01

简述

kotlin 由于 jetbrain 设计的开源语言,可编译为 JVM 字节码或 javascript。

在设计上,kotlin 吸收现代语言的优点,语法简约,号称与 java 100% 兼容(大部分的 java 代码可直接通过工具转换为 kotlin ),支持函数式编程,并提供很多语法糖。由于与 java 保持兼容,kotlin 可直接采用 java 的生态环境,而不需要像 go 等语言需要重新建立生态环境,因此 spring / hibernate 等 java 中常用的基础库可直接在 kotlin 中使用。目前,google 已在 android 上全面支持 kotlin ,spring 在 5 中会加强对 kotlin 的支持,在2017年7月TIOBE编程语言排行榜上 kotlin 进入前 50,由此可见 kotlin 的发展前景还是相对不错的。

与java 相比,相对 java 冗长的语法,kotlin 类似于 swift 和 python ,非常简洁。以包定义为例,java 的包需要与路径保持一致,而在 kotlin 中可放在任何的位置(更类似于 c# 的 namespace),代码组织上更加灵活。 习惯了 python 之后,觉得 kotlin 的代码要比 java 的表达能力强。而与 python 这类动态类型语言相比,kotlin 的静态类型在工程上会优势,在系统重构、代码自动提示时更加方便。如果要学习下一门的语言,不妨考虑 kotlin 。

当然,kotlin 并不完美,设计者不可能考虑到所有人的使用习惯,但就目前的规范来说,至少是足够好的,能解决目前 java 的很多问题。 我不太喜欢 kotlin 的异常处理,它在异常处理中去掉了受检异常,我觉得不是太好,但本身 checked exception 这个东西就有争议,而 java 标准库的异常设计本身也还带有些问题(见讨论),就更不能苛求这一特性。

开始

环境准备

要运行 kotlin 还需要准备 kotlin 的运行时,命令行编译工具见http://kotlinlang.org/docs/tutorials/command-line.html

使用 Intellij IDEA 或 elipse ,可用 gradle 的方式:

settings.gradle

rootProject.name = 'kotlin-learn'

build.gradle

buildscript {
    ext.kotlin_version = '1.+'

    repositories {
        mavenLocal()
        maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
        mavenCentral()
    }

    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

apply plugin: 'idea'
apply plugin: 'eclipse'
apply plugin: 'kotlin'

repositories {
    mavenLocal()
    maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
    mavenCentral()
}

dependencies {
    compile "org.jetbrains.kotlin:kotlin-stdlib-jre8:$kotlin_version"
}

compileKotlin {
    kotlinOptions {
        jvmTarget = "1.8"
    }
}

compileTestKotlin {
    kotlinOptions {
        jvmTarget = "1.8"
    }
}

注意 kotlin 的运行时需要 jvm 1.7 以上。

gradle ideagradle eclipse 生成 ide 的项目文件,就能在 idea 和 eclipse 中导入,在 ide 中还需要设置项目的 jdk 等参数。

helloworld

以一个 helloworld 开始 kotlin 的学习过程。kotlin 也是以 main 函数为入口,而 kotlin 支持直接使用函数,不需要使用类包装,helloworld.kt 代码如下:

fun main(args: Array<String>) {
    println("Hello, world!");
}

编译运行输出

Hello, world!

这个例子可看到,函数以 fun 开头,参数以参数名加参数类型。这个 main 函数没有返回值,没有指定返回类型。

作为一个最简单的示例,已经可见到 kotlin 要比 java 的更加简洁、表达力强。