kotlin 习惯用语

kotlin 习惯用语

刚学习 只能把官方文档给弄下来先,一步一步去学习。闲话少说 进入正题。。。

创建DTOs(POJOs/POCOs) 数据类

java的 pojo 是这样写一个User 类

public class User {
    private String name = "";
    private int age;
  ...
}

还要写一堆的get set 方法 感觉不是那么人性化啰,不过工具给力 可以自动生成这些方法,不过那么多代码 看上去也不是那么的舒服
来看看kotlin的User类

class User(val name:String ,val age:Int)

一行就搞定,连分号都不用,花括号都可以省略

data class User(val name:String ,val age:Int)

编译器会自动的从主构造函数中根据所有声明的属性提取以下函数:
equals() / hashCode()
toString() 格式如 “User(name=John, age=42)”
componentN() functions 对应于属性,按声明顺序排列
copy() 函数
如果这些函数在类中已经被明确定义了,或者从超类中继承而来,就不再会生成。
是不是很酷,写少了很多代码 且功能又比较完善

函数默认值

fun foo(a: Int = 0, b: String = “”) {…}
这个对写有默认的东西方便很多 例如android 的Toast 加上kotlin的扩展函数 给32个赞。。。

fun Activity.toast(message: CharSequence, duration: Int = Toast.LENGTH_SHORT) { 
    Toast.makeText(getActivity(), message, duration).show()
}
//直接这样写
    toast("Hello world!")

过滤 list

val positives = list.filter { x -> x >0 }
或者
val positives = list.filter { it > 0 }

实例检查

when (x) {
    is Foo ->  ...
    is Bar -> ...
    else -> ...
}

kotlin 用when 代替了switch ,这个比switch好用多了 ,还可以返回值

var a= when (x) {
    is Foo ->  "sss"
    is Bar -> "eee"
    else -> "qq"
}

遍历 map/list

for ((k, v) in map) {
    print("$k -> $v")
}

这样就可以很简单的把map的 key 和value 读出来了

使用 ranges

for (i in 1..100) { ... }  // 闭区间: 包括100
for (i in 1 until 100) { ... } // 半开区间: 不包括100
for (x in 2..10 step 2) { ... }
for (x in 10 downTo 1) { ... }

注意的是 1..100 打印出来的是1..100

只读 list

val list = listOf("a", "b", "c")

只读map

val map = mapOf("a" to 1, "b" to 2, "c" to 3)

访问map

println(map["key"])
map["key"] = value

懒属性(延迟加载)

val p: String by lazy {
    "hello world"
}

上面这段代码创建了一个 string。但这只会发生在第一次使用的时候。
延迟初始化

lateinit var adapter: ListAdapter
在oncreat()
再调用
adapter=ListAdapter(..)

扩展函数

fun Activity.toast(message: CharSequence, duration: Int = Toast.LENGTH_SHORT) { 
    Toast.makeText(getActivity(), message, duration).show()
}
//直接这样写
    toast("Hello world!")

创建单例模式

kotlin 中写单例模式很简单 在class 前面加object 就是了
kotlin中的object 和java中的object不一样

object Resource {
    val name = "Name"
}

如果不为空执行某操作

val date = ...
data?.let{
    ...//如果不为空执行该语句块
}

try-catch 表达式

fun test() {
    val result = try {
        count()
    }catch (e: ArithmeticException) {
        throw IllegaStateException(e)
    }
    //处理 result
}

利用 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()
}

就这样复制粘贴完成了。。

发表评论

电子邮件地址不会被公开。 必填项已用*标注