Kotlin初步了解与尝试

在前不久的Google I/O keynote大会上,Kotlin被安卓团队宣布成为新的一级开发语言(first-class support for Kotlin),Kotlin官网的首页应景地在显眼的地方添上了一行“Now Offcial in Android”,这则新闻也因此发酵为近日被热情讨论的一颗重磅炸弹。作为JetBrains公司开发的一个新式编程语言,我们平时在使用Intellj IDEA的过程中,便经常可以见到Kotlin的身影,半年前开始年轻有为的周洲学弟也时不时向我们安利Kotlin语言的各种优势。当然除此之外,得益于Kotlin基于JVM的特点,一些“先驱者”们早在一两年前就已将Kotlin投入到了JAVA/Android的实践开发中。总之借此编写博客的机会,我希望记录一下对Kotlin这个正向前迈进的语言,粗浅的了解过程。

Kotlin是一种在JAVA虚拟机上可以运行的静态类型编程语言,也可以被编译为JavaScript源码,它被设计为可以与JAVA代码相互运作,甚至可以使用大量的现有JAVA类库,得益于这个性质,作为一个新生的语言,Kotlin就拥有了大量的高质量类库。Kotlin语法特点中,有较为明显的函数式编程的特征,包括一些较为优雅的LAMBDA表达式、自由的类型声明与转换等特性,而不再受限于有时臃肿的完全面向对象的语法,因此在比JAVA简洁的同时,可以较好地兼容现有的JAVA语言与运行环境可能是他显眼的优点,被用于Android开发也印证了这一点(基于JAVA的安卓应用编写的代码量还是比较多的)。

下面借用Intellij IDEA的一些现有功能转化一个现成的Android模板项目为Kotlin语言作为简单的实验。

首先在Intellj中创建一个新的Android模板项目,修改项目的build.gradle文件,在buildscripts块中添加记录kotlin版本的全局变量与对kotlin的依赖:

buildscript {
    ext.kotlin_version = '1.1.2-2'
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.2.2'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

Gradle是一款自动化构建工具,在默认情况下Gradle会将目录下的build.gradle文件作为当前项目的构建文件。其中buildscripts块定义了全局的相关属性,ext.kotlin_version作用为声明一个全局的可用变量记录kotlin的版本号,因为其他地方会多次用到这个信息(版本号与Intellij的kotlin版本不一致会有提示);repositories定义仓库,这里仓库为jcenter;dependencies则为依赖关系,这里除了本身的android以外,我们需要添加一条对kotlin的依赖。

接下来则需要添加app模块中的build.gradle中的相关配置信息:

apply plugin: 'kotlin-android'
android {
    sourceSets {
        main.java.srcDirs += 'src/main/kotlin'
    }
}
dependencies {
    compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
}

这里省去了一些已有的构建信息,主要是添加对Kotlin-android的依赖与将新的kotlin目录增添至source目录中。

配置好后可以利用IDEA自带的功能(Android Studio应该也有),使用Ctrl+Shift+Alt+K将android模板中的Activity类转换为kotlin文件,并移动至kotlin目录中,注意保持包名一致。目录结构如下图,java包中的LoginActivity为我备份的原本的java类。

目录结构

使用安卓模拟器可以正常启动被kt化的Activity:

安卓模拟器画面

这里的一个细节是,需要将kt化后的onCreateLoader函数中的参数的Bundle后添上问号,实现null-safe处理以免启动时因为bundle值为null而抛出异常。(这里也可以看出自动化转化的功能不一定是完美的)。

截取一段被kt化后的Activity组件中的方法代码如下:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_login)
    // Set up the login form.
    mEmailView = findViewById(R.id.email) as AutoCompleteTextView
    populateAutoComplete()

    mPasswordView = findViewById(R.id.password) as EditText
    mPasswordView!!.setOnEditorActionListener(TextView.OnEditorActionListener { textView, id, keyEvent ->
        if (id == R.id.login || id == EditorInfo.IME_NULL) {
            attemptLogin()
            return@OnEditorActionListener true
        }
        false
    })

    val mEmailSignInButton = findViewById(R.id.email_sign_in_button) as Button
    mEmailSignInButton.setOnClickListener { attemptLogin() }

    mLoginFormView = findViewById(R.id.login_form)
    mProgressView = findViewById(R.id.login_progress)
}

可以看到kotlin语言的特点,包括在参数/变量后添加问号实现null-safe(如果不为null正常执行,若为null则返回null值,也可以设置缺省返回);利用LAMBDA表达式实现匿名函数,从而简化代码,避免java冗长的隐式内部类的代码编写(当然JAVA8也引入了对LAMBDA表达式的支持);代码块的最后一行可以作为整个块的值,如之前代码中LAMBDA表达式最后的false语句;通过@OnEditorActionListener声明返回值的定域……

除此之外,kotlin还支持if-else或when等语句作为右值进行编写等函数式编程的优势特征,但因为我刚刚接触这个语言,暂时不能做出一些有效的总结,希望在之后的了解与学习中,能对kotlin语言得到更多的理解与运用~

中间的配置过程参考自:https://zhuanlan.zhihu.com/p/27100220

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,976评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,249评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,449评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,433评论 1 296
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,460评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,132评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,721评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,641评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,180评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,267评论 3 339
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,408评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,076评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,767评论 3 332
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,255评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,386评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,764评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,413评论 2 358

推荐阅读更多精彩内容