1.创建 DTOs(POJOs/POCOs):
data class Customer(val name: String, val email: String)
这个操作会为 Customer 类提供以下功能:
所有属性的 getters (对于 var 定义的还有 setters)、equals()、hashCode()、toString()、copy()、所有属性的 component1() 、 component2() ……等等
2.函数默认参数在函数构造时传入 : fun foo(a: Int = 0, b: String = "") { …… },即如果不进行赋值则以默认参数为值
3.过滤 list : val positives = list.filter { x -> x > 0 },在大括号中写过滤的条件
4.字符串内插 : println("Name $name") ,会将名为 name 的变量值插入
5.扩展函数
6.创建单例
object+函数名 {
val name = "Name"
}
7.?:当希望传入参数可为空时,在类名后加 ? ,如:fun doStudy(study:Study?){...}
8.?.:当对象不为空时调用相应的方法,当对象为空时则什么也不做,如 : a?.doSomething()
9. ?: : ?:(一个问号和一个冒号)操作符左右两边都接受一个表达式,如果左边表达式结果不为空就返回左边的结果,否则就返回右边的结果,如 : val c = a ?: b
10.!! : !!(两个感叹号)是非空断言工具,写法是在对象后加上!!,如 : val upperCase = content!!.toUpperCase(),意在告诉Kotlin,我非常确信这里的对象不会为空,所以不用你来帮我做空指针检查,如果出现问题你就直接抛出空指针异常,后果我自己来承担
11.返回 when 表达式
fun transform(color: String): Int {
return when (color) {
"Red" -> 0
"Green" -> 1
"Blue" -> 2
else -> throw IllegalArgumentException("Invalid color param value")
}
}
12.“try/catch”表达式
fun test() {
val result = try {
count()
} catch (e: ArithmeticException) {
throw IllegalStateException(e)
}
// 使用 result
}
13.对一个对象实例调用多个方法 ( with )
习惯用法
class Turtle {
fun penDown()
fun penUp()
fun turn(degrees: Double)
fun forward(pixels: Double)
}
val myTurtle = Turtle()
with(myTurtle) { // 画一个 100 像素的正方形
penDown()
for (i in 1..4) {
forward(100.0)
turn(90.0)
}
penUp()
}
//with后不用加类名,直接写方法名
14.配置对象的属性( apply )
val myRectangle = Rectangle().apply {
length = 4
breadth = 5
color = 0xFAFAFA
}
//apply和with很类似
15.run:
val list = listOf(......)
val result = StringBuilder().run{
append("Start eating fruits.\n")
for(fruit in list){
append(fruit).append("\n")
}
append("Ate all fruits.")
toString()
}
println(result)
16.run,with,apply的共同点和区别:run和apply不能直接调用,而是需要调用某个对象的run或with函数,且两者都只接收一个Lambda函数,并会在Lambda表达式中提供调用对象的上下文.其次,run和with会使用Lambda表达式中最后一行代码作为返回值返回,apply则无法指定返回值,而是会自动返回调用者本身