简介
Kotlin虽说是Java的扩展,能够使用Java类库,但是语法规则完全不同于Java。所以学习Kotlin要么直接忘了Java语法,要么跟Java比较看看区别在哪。经过了一天的折腾我选择先忘掉Java学完Kotlin再比较
关键字(尽量补全)
by
as
lazy
init
downTo
声明:open
override
fun
inline
inner
internal
data
companion
object
lateinit
var
val
判断:when
in
is
运算:and
or
类型
Any
Unit
基本类型:Boolean
Byte
Short
Int
Long
Float
Double
Char
Android项目中使用Kotlin
1. 安装Kotlit插件
Android Studio 默认没有装Kotlin插件File/Setting/Plugins/Install JetBrains plugin
搜索Kotlin点击Install
安装,Kotlin Extensions For Android已经过时废弃了。接下来只需要简单的配置就可在项目中使用Kotlin和Java同时开发了。
2. 使用Kotlin
项目gradle加入编译脚本
buildscript {
ext.kotlin_version = '1.0.3'
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.1.3'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}
当前工程gradle加入引用
apply plugin: 'kotlin-android'
//...
android {
sourceSets {
//添加一个源码文件夹
main.java.srcDirs += 'src/main/kotlin'
}
}
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
testCompile 'junit:junit:4.12'
//Kotlin
compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
//...
}
以上操作其实只需要在Tools->Kotlin->Configure Kotlin in Project
即可自动配置
3. 使用Kotlin的Android扩展插件
kotlin-android-extensions
使用这个插件,再需要调用findViewById,XML布局定义的控件,会自动生成引用,对于我们来说现在布局文件就是一个属性
加入编译脚本(这个版本已经很旧了,版本号自行修改)
buildscript {
ext.kotlin_version = '1.0.3'
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.1.3'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath "org.jetbrains.kotlin:kotlin-android-extensions:$kotlin_version"
}
}
加入引用
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
//...
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
testCompile 'junit:junit:4.12'
//Kotlin
compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
//...
}
另外还可使用Anko
,Anko目的是用代码来代替XML生成布局,加入引用即可
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
//...
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
testCompile 'junit:junit:4.12'
//...
// Anko
compile 'org.jetbrains.anko:anko-sdk15:0.8.2' // sdk19, sdk21, sdk23 are also available
compile 'org.jetbrains.anko:anko-support-v4:0.8.2' // In case you need support-v4 bindings
compile 'org.jetbrains.anko:anko-appcompat-v7:0.8.2' // For appcompat-v7 bindings
}
Kotlin 基本语法
先说个学习Kotlin语法的小窍门,将代码用Java写好,然后Code/Conver Java File to Kotlin File
转换成Kotlin代码,或者将Java代码复制到Kotlin文件会提示转换也是挺方便的,比较差异很容易就能理解了,一开始难免不适应习惯后相信你一定会喜欢上Kotlin
定义
忘掉Java的那一套写法不然会很不适应的,Kotlin有自己的特性不该被Java的思维所束缚。在Kotlin中常量用val
声明,变了用var
声明,关键字在前面,类型以冒号:
隔开在后面,也可以省略直接赋值,类型后带问号?
表示可为空类型(默认空安全)。
常量val
延迟加载by lazy{}
,默认线程安全关闭线程安全lazy(LazyThreadSafetyMode.NONE){}
,变量var
延迟加载lateinit
。
//常量数组int[][][] arrs = new int[3][2][1];
val arrs = Array(3) { Array(2) { IntArray(1) } }
//空安全变量
var str: String = "hello"
//可为空字符串变量
var str1: String? = null
条件
if...else
正常使用,不过移除了switch
用更强大的when
替代,when子式可以是各种返回Boolean的表达式
val x = 7
when (x) {
in 1..10 -> print("x is in the range")
in validNumbers -> print("x is valid")
!in 10..20 -> print("x is outside the range")
else -> print("none of the above")
}
循环
while
和 do...while
同Java并无区别,for
则有很大改变并多出了几个变种
val list = ArrayList<String>()
//递增for (int i = 0; i < list.size(); i++)
for (i in list.indices) {
print(list[i])
}
//递增for (int i = 2; i < list.size(); i++)
for (i in 2..list.size-1) {
print(list[i])
}
//递减for (int i = list.size(); i >= 0; i--)
for (i in list.size downTo 0) {
print(list[i])
}
//操作列表内的对象
for (item in list) {
print(item)
}
//加强版
for((i, item) in list.witnIndex()) {
print(list[i])
print(item)
}
//变种版
list.forEach {
print(it)
}
list.forEach {
print(it)
}
list.forEachIndexed { i, s ->
print(list[i])
print(s)
}
list.forEachIndexed(object :(Int,String) -> Unit{
override fun invoke(i: Int, s: String) {
print(list[i])
print(s)
}
})
参考资料
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。转载请保留作者及原文链接
网友评论