Kotlin开发Android《第一行代码》第二弹
标准函数
let
一个函数,提供了函数式api接口,并将原始调用对象作为参数传递到lambda表达式里面。它配合?.可以发挥很大作用。而且let可以处理全局变量的判空问题。
a?.doSomething()
a?.doStudy()
//上面其实a是否为空每一句都判断了,代码复杂了。但是用let函数,在外面先判断一次,然后就做操作
a?.let{
a1-> a.doSomething()
a.doStudy()
}
//再次简化,当lambda表达式里面只有一个传入参数的时候,可以声明直接用it来指代
a?.let{
it.doSomething()
it.doStudy()
}
with
with 函数接收连个参数,一个是任意类型的对象,第二个参数是lambda表达式。with函数会在lambda表达式中提供第一个参数对象的上下文,并且lambda表达式的最后一行,作为返回值返回。
//普通写法
val builder=StringBuilder()
builder.append("1111")
builder.append(2222")
val result=builder.toString()
//with 函数
val result=with(StringBuilder()){//StringBuilder()的一个实例对象当作第一个参数
append("1111")
append(2222")
toString()
}
run
run函数和with函数调用场景很类似,但是有一点,run函数不能直接调用,必须调用某个对象的run函数,然后run函数只接受一个lambda表达式,并且会在lambda表达式中提供调用对象的上下文,其他和with一样,最后一行也是返回值。
val result=StringBuilder().run{
append("1111")
append(2222")
toString()
}
apply
该函数和run函数run极其类似,都要在某个对象上调用,都接收lambda表达式,也会在lambda里面提供该对象的上下文,但是没办法指定返回值,这个函数的返回值就是调用对象本身。
val result=StringBuilder().run{ //这里的result 拿到的实际上是StringBuilder()的实例对象
append("1111")
append(2222")
}
result.toString()
实现静态方法
单例类
可以通过单例类来实现,单例类里面的方法都可以类似于静态方法调用。但是单例类里面所有的方法都可以类似于静态方法调用,但是有时候我们希望某个类里面的某个方法变成静态方法的调用。那就需要下面的方法来。
companion object
实际意义上,companion object关键字定义的方法不是静态方法,只是会生成一个伴生类,然后通过伴生类调用实例方法。但是kotlin保证一个类内部只有一个伴生类,所以相当于是实现了静态方法。 调用的时候其实就是 Util.doAction()。其实已经基本上满足大多数场景了。
class Util
{
companion object{
doAction()
}
}
@JvmStatic
这个注解才是真正实现的静态方法,但是该注释只能写在单例类和companion object中的方法上。这个是真正意义上的静态方法。Util.doAction()
class Util
{
companion object{
@JvmStatic
doAction()
}
}
|