Kotlin 语法
2017-05-27 15:22
204 查看
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 = "word" //可为空字符串变量 var str2: String? = null
2). 条件
if...else正常使用,不过移除了
switch用更强大的
when替代,when子式可以是常量、变量、返回数值的表达式、返回Boolean值的表达式,强大到用来替换
if...else if
// 测试值 x = 0, -1, 1, 2, 3, 6, 10 var x = 10 when (x) { //常量 2 -> println("等于2") //数值表达式 if (x > 0) 1 else -1 -> println("大于0并等于1,或小于0并等于-1") //Boolean类型表达式 in 1..5 -> println("范围匹配1-5") !in 6..9 -> println("不是6-9") is Int -> println("类型判断") else -> println("else") } // 代替if...else if when{ x > 6 && x <= 10 -> println("大于6小于等于10") x < 6 -> println("小于6") else -> println("else") }
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; } }
反之Kotlin的属性自动生成Java的
getter/setter方法,方便在Java中调用,同样的定义在Kotlin中
class User { var name: String? = null var age: String? = null }
这样一个Java类在Kotlin中只需这样调用
val user = User() //赋值 user.name = "tutu" user.age = "23" //取值 val name = user.name val age = user.age
我们的
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很高级完全看不懂,其实很简单的就是把接口名、方法名和参数类型省掉不写再加个
->罢了,明白这点了很好理解。
// 无参数无返回值 Thread(Runnable { sleep(1000) }).start() // 单参数不带返回值 view.setOnClickListener { v -> Log.e("tag", "${v.tag}") } // 多参数带返回值 view.setOnKeyListener(View.OnKeyListener { v, keyCode, event -> Log.e("tag", "keyCode$keyCode, ${event.keyCode}") if (event.keyCode == KeyEvent.KEYCODE_BACK) return@OnKeyListener true false })
新面孔
1). 延迟加载2). 流程控制
内容上一篇写过参考
Android Kotlin 学习笔记,不重复介绍
空判断
Kotlin的空安全设计对于声明可为空的参数,在使用时要进行空判断处理,有两种处理方式,字段后加!!像Java一样抛出空异常,另一种字段后加
?可不做处理返回值为 null或配合
?:做空判断处理
//类型后面加?表示可为空 var age: String? = "23" //抛出空指针异常 val ages = age!!.toInt() //不做处理返回 null val ages1 = age?.toInt() //age为空返回-1 val ages2 = age?.toInt() ?: -1
更多空处理NullPointException 利器 Kotlin 可选型
注意事项
内部类和参数默认为public,而在Java中为private类默认为不可继承(final),想要可被继承要声明为
open或
abstract
取消了static关键字,静态方法和参数统一写在
companion object块
internal模块内可见,inner内部类
以上仅是对使用频率较高的语法总结,学会基本可以阅读Kotlin代码,遇到点问题Google速查一下,至于智能转换、类型推导之类的不用说使用后喜欢自然就会了。当然这只是kotlin的基本语法,方便Java快速熟悉kotlin,深入学习还请阅读相关资料。
相关链接
在线学习Kotlin 官方文档
翻译出处kotlin-web-site-cn
中文站(更新到 1.1):https://www.kotlincn.net/
网址(更新到 1.0.3):http://tanfujun.com/kotlin-web-site-cn/
Kotlin 中文论坛:https://www.kotliner.cn/
相关文章推荐
- 简明 Kotlin【002】启程:基本语法
- Kotlin基础语法学习笔记
- Kotlin------数据类型和语法
- Kotlin与Swift 从零开始(一)基础语法
- Kotlin开发Android(2): Kotlin声明变量常量方法等基本语法
- kotlin基础笔记之类、接口、函数和基本语法
- kotlin学习笔记-2-基础语法
- Kotlin学习——基本语法
- Kotlin语法基础,包引入
- Kotlin 入门基础语法学习笔记
- KotLin学习--集合过滤操作的惯用语法
- Kotlin Primer·第二章·基本语法
- Kotlin学习--控制语法之when
- Kotlin语法基础,运算符
- Android Kotlin学习--基础语法
- kotlin学习-基本语法(二)
- Kotlin初探之语法简介分析
- kotlin常用语法
- kotlin 语法
- Kotlin------数据类型和语法