- $
println("itemB:$itemB")
//字符串模板
var userInfo = "name:${user.name}, age:$age"
- ?
表示对象可能为空
//在变量类型后面加上问号,代表该变量是可空变量
var name: String? = "zhangsan"
/**
* 如果str不能转为Int类型,则返回null
*/
fun parseInt(str: String): Int? {
// (代码略)
}
b?.length //如果 b非空,就返回 b.length ,否则返回 null,这个表达式的类型是 Int? 。
- ?:
//如果r非空,我使用它;否则使⽤某个非空的值 x ”:
val l = b?.length ?: -1
- !!
//返回一个非空的 b 值 或者如果 b 为空,就会抛出一个 NPE 异常
val l = b!!.length
- ==,===
==判断值是否相等,===判断值及引用是否完全相等。
- ..
Kotlin中有区间的概念,区间表达式由具有操作符形式 .. 的 rangeTo 函数辅以 in 和 !in 形成。 区间是为任何可比较类型定义的,但对于整型原生类型,它有一个优化的实现。
if (i in 1..10) { // 等同于 1 <= i && i <= 10
println(i)
}
- _
data class Book(var id: Int, var name: String)
val book = Book(1, "英语")
val (id, _) = book
- ::
获取类的属性,方法 - @
//1、限定this的类型
class User {
inner class State{
fun getUser(): User{
//返回User
return this@User
}
fun getState(): State{
//返回State
return this@State
}
}
}
//2、作为标签
loop@ for (itemA in arraysA) {
var i : Int = 0
for (itemB in arraysB) {
i++
if (itemB > 2) {
break@loop
}
println("itemB:$itemB")
}
}
-
2018.11.21更新(平时编码注意点)
(1)优先使用不可变(而不是可变)数据。初始化后未修改的局部变量与属性,总是将其声明为 val 而不是 var 。总是使用不可变集合接口( Collection , List , Set , Map )来声明无需改变的集合。使用工厂函数创建集合实例时,尽可能选用返回不可变集合类型的函数:
// 不良:使用可变集合类型作为无需改变的值
fun validateValue(actualValue: String, allowedValues: HashSet<String>) { ...... }
// 良好:使用不可变集合类型
fun validateValue(actualValue: String, allowedValues: Set<String>) { ...... }
// 不良:arrayListOf() 返回 ArrayList<T>,这是一个可变集合类型
val allowedValues = arrayListOf("a", "b", "c")
// 良好:listOf() 返回 List<T>
val allowedValues = listOf("a", "b", "c")
(2)使用 until 函数在一个区间上循环:
for (1 in 0 until n){......}
(3)拓展函数also with let run apply的区别
参考 (https://blog.csdn.net/ljd2038/article/details/79576091)
参考文献:
https://blog.csdn.net/zxc123e/article/details/73368781