您的位置:首页 > 移动开发 > Android开发

Kotlin入门教程

2017-06-12 13:39 141 查看
Kotlin 基本语法
先说个学习Kotlin语法的小窍门,将代码用Java写好,然后 Code/Conver Java File to Kotlin File 转换成Kotlin代码,或者将Java代码复制到Kotlin文件会提示转换也是挺方便的,比较差异很容易就能理解了,一开始难免不适应习惯后相信你一定会喜欢上Kotlin
1). 定义
忘掉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
2). 条件
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")

}
3). 循环
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)

}

})
万能的冒号
在Kotlin中冒号 : 用万能来称呼绝不为过。常量变量的类型声明,函数的返回值,类的继承都需要它

//val表示常量var表示变量声明

val name: String = "tutu"

//省略类型说明

var age = "23"

//fun表示函数

fun getName(): String{

return "tutu"

}

//类继承

class UserList<E>(): ArrayList<E>() {

//...

}
除此之外还有一个特别的地方也需要它,使用Java类的时候。Kotlin最终会还是编译成Java字节码,使用到Java类是必然的,在Kotlin语法如下

val intent = Intent(this, MainActivity::class.java)
类名 ::class.java 没有为什么就这么写记着就是
我是谁的@
除了冒号另一个重要符号 @ ,想必用到内部类和匿名内部类的地方一定很多,再加上支持lambda语法,没有它谁告诉你 this 和 return 指的是哪一个

class User {

inner class State{

fun getUser(): User{

//返回User

return this@User

}

fun getState(): State{

//返回State

return this@State

}

}

}
偷懒的方法
1). Kotlin特色
Java的 getter/setter 方法自动转换成属性,对应到Kotlin属性的调用

public class User {

private String name;

private String age;

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getAge() {

return age;

}

public void setAge(String age) {

this.age = age;

}

}
这样一个Java类在Kotlin中只需这样调用

val user = User()

//赋值

user.name = "tutu"

user.age = "23"

//取值

val name = user.name

val age = user.age
反之Kotlin的属性自动生成Java的 getter/setter 方法,方便在Java中调用,同样的定义在Kotlin中

class User {

var name: String? = null

var age: String? = null

}
我们的 getter/setter 方法有时不会这么简单,这就需要自定义 getter/setter 了,另起一行设置get()/set(value)方法,实现一个Java中常用的单例,这里只为了展示,单例在Kotlin有更简单的方法实现,只要在
package 级别创建一个 object 即可

class User {

companion object {

@Volatile var instance: User? = null

get() {

if (field == null) {

synchronized(User::class.java) {

if (field == null)

field = User()

}

}

return field

}

}

var name: String? = null

var age: String? = null

}
自定义 getter/setter 重点在 field ,跟我们熟悉所Java的 this 指代当前类一样, field 指代当前参数,直接使用参数名 instance 代替不会报错但单例就没效果了
2). 字符串模板
在Java中拼接字符串的代码可读性都很差,在Kotlin字符串拼接变得非常简洁,只需用 $ 后面加上参数名,复杂的参数要加上 {}

val user = User()

//赋值

user.name = "tutu"

user.age = "23"

//取值

val name = user.name

val age = user.age

var userInfo = "name:${user.name}, age:$age"

//输出结果:name:tutu, age:23
3). lambda
一开始觉得lambda很高级完全看不懂,其实很简单的就是把接口名、方法名和参数类型省掉不写再加个 -> 罢了,明白这点了就不介绍。
空判断
Kotlin的空安全设计对于声明可为空的参数,在使用时要进行空判断处理,有两种处理方式一种像Java一样抛出空异常,字段后加 !! ,另一种不做处理直接跳过,字段后加 ?

//类型后面加?表示可为空

var age: String? = "23"

//抛出空指针异常

val ageInt = age!!.toInt()

//不做处理跳过

val ages = age?.toInt()
注意事项
内部类和参数默认为public,而在Java中为private
类默认为不可继承(final),想要可被继承要声明为 open 或 abstract
取消了static关键字,静态方法和参数统一写在 companion object 块
internal模块内可见,inner内部类
以上仅是对使用频率较高的语法总结,学会基本可以阅读Kotlin代码,遇到点问题Google速查一下,至于智能转换、类型推导之类的不用说使用后喜欢自然就会了。当然这只是kotlin的基本语法,方便Java快速熟悉kotlin,深入学习还请阅读相关资料。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息