Kotlin新型语言大家应该不陌生,尤其是Android开发者都会或多或少听说过Kotlin。接下来就讲一讲这门简洁,高效,快捷的Kotlin语言。
是公司 JetBrains 研发的语言。是一门支持多范式、多平台的现代静态编程语言。Kotlin 支持面向对象、泛型与函数式等编程范式,它支持 JVM、Android、Java 目标平台,而 原生(Native)平台的 Kotlin 几天前也发布了 0.2 版本。而且 Kotlin 具有很多现代(也有称下一代的)静态语言特性:如类型推断、多范式支持、可空性表达、扩展函数、模式匹配等。
Kotlin 是一个实用性很强的语言,专注于互通,安全,简洁,工具健全...
二、为什么要推广这个语言?
2.1 Java 语言的限制和问题
例如,我们不能给不是我们自己写的 types、classes 或者 interfaces 增加新的方法。长时间以来,我们都会采用 util 类,杂乱无章地堆砌着我们代码或者或者揉在同一个 util package 里面。如果这是解决方案的话,它肯定不理想。
Java 语言的类型系统都有 null 的问题,在 android 上更为明显。因为它没有对可能是或不是 null 的类型完成 first-class representation。所以,被称作 “billion dollar mistake” 的 null 指针异常最后会毁了你的应用。
接下来, Java 肯定不是最简洁的语言。这件事本身不是件坏事,但是事实上存在太多的常见的冗余。这会带来潜在的错误和缺陷。在这之前,我们还要处理安卓 API 带来的问题。
2.2 Android API 的设计问题
安卓是一个庞大的继承系统;他们为他们的继承系统而感到自豪,对他们来说这个系统工作的也非常的正常,但是这个系统倾向于把问题推向应用开发者。而且,空引用的问题也回来了,这个问题在安卓系统中十分明显,因为他们想让系统更加有效些。null 被用在许多地方来代表值的缺失,而不是封装成更高级的类型,比如一个类型或者可选项。
同时,回到语言的冗余,安卓的 API 有着自己许多的范式。这也许是因为性能的原因。设计者们最后写出的这些 APIs 需要你,开发者,来做许多的事情来提高效率而不是用其他的方法抽象它们。
2.3 与Java相比有什么好处
更容易表现
,使用kotlin你可以少写很多代码,比如创建数据类等。
更安全 ,在用Java开发时,大多数代码都是预防性的。为了不遇到非预期的NullPointerException,在使用之前,要不断的检测对象是否为空。与许多其它语言一样,因为需要使用安全调用运算符显式指明对象是否能够为空(null),所以Kotlin是空类型安全的
是函数式的 ,Kotlin是基于面向对象的语言。但是就如其他很多现代的语言那样,它使用了很多函数式编程的概念,比如,使用lambda表达式来更方便地解决问题。其中一个很棒的特性就是Collections的处理方式。
可以扩展函数 ,这意味着我们可以扩展类的更多的特性,甚至我们没有权限去访问这个类
更安全 ,在用Java开发时,大多数代码都是预防性的。为了不遇到非预期的NullPointerException,在使用之前,要不断的检测对象是否为空。与许多其它语言一样,因为需要使用安全调用运算符显式指明对象是否能够为空(null),所以Kotlin是空类型安全的
是函数式的 ,Kotlin是基于面向对象的语言。但是就如其他很多现代的语言那样,它使用了很多函数式编程的概念,比如,使用lambda表达式来更方便地解决问题。其中一个很棒的特性就是Collections的处理方式。
可以扩展函数 ,这意味着我们可以扩展类的更多的特性,甚至我们没有权限去访问这个类
三、语法介绍
3.1 语法简单
//variables and constants
var currentVersionCode = 1 //变量当前的版本号,类型Int可以根据值推断出来
var currentVersionName : String = "1.0" //显式标明类型
val APPNAME = "droidyue.com" //常量APPNAME 类型(String)可以根据值推断出来
//methods
fun main(args: Array<String>) {
println(args)
}
// class
class MainActivity : AppCompatActivity() {
}
// data class 自动生成getter,setting,hashcode和equals等方法
data class Book(var name: String, val price: Float, var author: String)
//支持默认参数值,减少方法重载
fun Context.showToast(message: String, duration:Int = Toast.LENGTH_LONG) {
Toast.makeText(this, message, duration).show()
}
- Kotlin支持类型推断,没有Java那样的啰嗦。
- 另外用var表示变量,val表示常量更加的简洁
- 方法也很简单,连function都缩写成了fun,平添了几分双关之意。
- 类的继承和实现很简单,使用:即可
- Kotlin每个句子都不需要加分号(;)
3.2 空指针安全
3.2.1 在类型上的处理,即在类型后面加上?,即表示这个变量或参数以及返回值可以为null,否则不允许为变量参数赋值为null或者返回null
3.2.2 对于一个可能是null的变量或者参数,在调用对象方法或者属性之前,需要加上?,否则编译无法通过。
如下面的代码就是Kotlin实现空指针安全的一个例子,而且相对Java实现而言,简直是一行代码搞定的。
fun testNullSafeOperator(string: String?) {
System.out.println(string?.toCharArray()?.getOrNull(10)?.hashCode())
}
testNullSafeOperator(null)
testNullSafeOperator("12345678901")
testNullSafeOperator("123")
//result
null
49
null
3.2.3 支持方法扩展
很多时候,Framework提供给我们的API往往都时比较原子的,调用时需要我们进行组合处理,因为就会产生了一些Util类
但是Kotlin的实现只需要重写扩展方法就可以了,比如这个longToast方法扩展到所有的Context对象中。
fun Context.longToast(message: String) {
Toast.makeText(this, message, Toast.LENGTH_LONG).show()
}
applicationContext.longToast("hello world")
注意:Kotlin的方法扩展并不是真正修改了对应的类文件,而是在编译器和IDE方面做得处理。使我们看起来像是扩展了方法。
3.2.4 Lambda, 高阶函数,Streams API, 函数式编程支持
所谓的Lambda表达式是匿名函数,这使得我们的代码会更加的简单。比如下面的代码就是lambda的应用。
findViewById(R.id.content).setOnClickListener {
Log.d("MainActivity", "$it was clicked")
}
所谓的高阶函数就是
- 可以接受函数作为参数
- 也可以返回函数作为结果
3.2.5 字符串模板
val book = Book("Thinking In Java", 59.0f, "Unknown")
val extraValue = "extra"
Log.d("MainActivity", "book.name = ${book.name}; book.price=${book.price};extraValue=$extraValue")
3.2.6 与Java交互性好
Kotlin和Java都属于基于JVM的编程语言。Kotlin和Java的交互性很好,可以说是无缝连接。这表现在
- Kotlin可以自由的引用Java的代码,反之亦然。
- Kotlin可以现有的全部的Java框架和库
- Java文件可以很轻松的借助IntelliJ的插件转成kotlin
四、如何在Android studio中使用KotLin?
4.1 首先安装Kotlin插件
4.2 创建KotlinActivity
新建Android工程,这一步和以前创建安卓工程的步骤类似
只不过在工程创建完成后,再新建Activity的时候选择KotlinActivity:


自动创建的界面布局文件和之前的没什么区别,依然是xml格式的,同时manifest里也会自动添加该Activity的声明。
布局文件

通过import kotlinx.android.synthetic.<xml名字>.* 可以根据id直接获取相应的view

不用findViewById就可以直接操作界面控件了。
4.3 java文件转换为kt文件
此时
4.4 配置gradle
如果IDE提示需要配置Kotlin的时候,就点击配置就好了,会自动在project和module的build.gradle里配置好。如果是手动配置的话,请在project的build.gradle里配置:
// Top-level build file where you can add configuration options common to all sub-projects/modules.buildscript {ext . kotlin_version = '1.0.2-1' //配置1repositories {jcenter ()}dependencies {classpath 'com.android.tools.build:gradle:2.0.0'classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" //配置2classpath "org.jetbrains.kotlin:kotlin-android-extensions:$kotlin_version" //配置3}}allprojects {repositories {jcenter ()}
4.5 在app的目录(也就是你android代码目录)的build.gradle文件中添加简单的设置
以上配置了
apply plugin: 'kotlin-android'
compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
sourceSets {
main.java.srcDirs += 'src/main/kotlin'
}
按照以上方法配置无法运行起来,然后在app的目录做了下修改就ok了
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
android {
compileSdkVersion 26
buildToolsVersion "25.0.2"
defaultConfig {
applicationId "com.xiaolajiao.kotlinhello"
minSdkVersion 16
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
sourceSets {
main.java.srcDirs += 'src/main/kotlin'
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:26.0.0-alpha1'
compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
}
//在根目录配置的在这里也配置了一下就ok了
buildscript {
ext.kotlin_version = '1.0.2-1'
repositories {
jcenter()
}
dependencies {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}
4.6 常见问题
问题1:
Execution failed for task ':app:clean' .> Unable to delete file : C : \Users\User\KotlinGameEngine\app\build\intermediates\exploded - aar\com . android . support\appcompat - v7\2 3.0 . 1 \jars\classes . jar
解决方案:只要在app目录下的build.gradle文件中添加task:
task clean ( type : Exec ) {ext . lockhunter = '\"C:\\LockHunter.exe\"'def buildDir = file ( new File ( "build" ))commandLine 'cmd' , "$lockhunter" , '/delete' , '/silent' , buildDir}
问题2:
解决方案:在app目录下的build.gradle文件中添加:
apply plugin : 'kotlin-android-extensions'
以及要确保classpath配置了
五.Kotlin语言学习资料
classpath "org.jetbrains.kotlin:kotlin-android-extensions:$kotlin_version"
Kotlin 中文站首页:
https://www.kotlincn.net/