在前不久的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
网友评论