使用with、apply、run简化代码,增强可读性
//原始
task_viewpager.setScrollMode(UltraViewPager.ScrollMode.HORIZONTAL)
task_viewpager.adapter = SentenceAdapter(taskList)
task_viewpager.currentItem = index
//apply
task_viewpager.apply {
setScrollMode(UltraViewPager.ScrollMode.HORIZONTAL)
adapter = SentenceAdapter(taskList)
currentItem = index
}
//with
with(task_viewpager){
setScrollMode(UltraViewPager.ScrollMode.HORIZONTAL)
adapter = SentenceAdapter(taskList)
currentItem = index
}
//run
index = task_viewpager.run {
setScrollMode(UltraViewPager.ScrollMode.HORIZONTAL)
adapter = SentenceAdapter(taskList)
currentItem
}
相比较而言使用apply更符合链式编程的习惯
run函数具有表达式的,它返回最后一行的值
其他函数
- use
用在 Java 上的 try-with-resources 表达式上
val input = Files.newInputStream(Paths.get("input.txt"))
val byte = input.use({ input.read() })
- repeat
它接受函数和整数作为参数,函数会被调用 n 次,这个函数避免写循环。
repeat(10, { println("Hello") })
- require/assert/check
检测条件是否为true, 否则抛出异常。 其中 require 用在参数检查; 而 assert/check 用在内部状态检查,assert 抛出 AssertionException 、 check 抛出 IllegalStateException。
require(true,{"error message"})
空指针处理,避免长串!!出现
-
对于一个不可为空类型:如果直接给不可为空类型赋值一个可能为空的对象就在编译阶段就不能通过
-
对于一个可空类型:通过?声明,在访问该类型的时候直接访问不能编译通过,需要通过?.或者!!.
-
尽量多使用let 和 ?:代替!!
val user = User()
user!!.name!!.subSequence(0,5)!!.length
val user: User? = User()
//每次访问都用用?.判断
user?.name
user?.age
user?.toString()
//提前判断非空
if (user != null) {
user.name
user.age
user.toString()
}
//let语句
user?.let {
it.name
it.age
it.toString()
}
扩展函数
fun Activity.toast(msg:String, duration:Int = Toast.LENGTH_SHORT){
Toast.makeText(this,msg,duration)
}
fun Fragment.toast(msg:String, duration:Int = Toast.LENGTH_SHORT){
Toast.makeText(activity,msg,duration)
}
toast("123")
网友评论