- 函数的默认值能力
fun printName(name: String = "bob"): String{
return name
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
printName()
printName("kevin")
}
图上会分别输出 :
bob
kevin
因为在定义方法的时候, 已经给定默认值, 所以在调用方法的时候, 参数可以为空, 如果为空, 则取默认值
- 函数只有一个语句 , 可以将这个语句直接赋值给这个函数
fun printName(name:String) = println("message is $name")
- 函数嵌套(由于递归或者不希望外部函数访问)
- 扩展函数
给一些类新增些自己需要的方法, 这个类的对象可以直接调用我们定义的扩展方法
//通过id的Int直接获取到对应的字符串str
fun Int?.getStr(): String = this?.let { BaseApplication.getInstance().getString(this) } ?: ""
- lambda函数表达式
我们来对比下java8的lambda,如下:
Thread thread2 = new Thread(() -> {});
使用kotlin的lambda,如下:
val thread = Thread({println("thread") })
因为thread只有一个参数, 且这个参数是lambda,可以省略(), 如下:
val thread = Thread{ println("thread")}
总结:
5.1 kotlin的lamdba的参数是写在花括号内的, 而java8的则需要写在括号里
5.2 kotlin当类只有一个参数, 且参数是lambda表达式,可以省略()
注意: 每个landba表达式都是一个匿名内部对象
- lambda闭包声明
kotlin中可以对一个常量使用lambda闭包进行声明
//testprint是一个lamdba闭包对象
val testprint = {name:String->
println(name)
}
//调用
testprint("bob")
- 高阶函数 (可以使用inline修饰,减少匿名对象的创建,编译的时候会直接转换成语句行 )
定义: 函数的参数又是一个函数,或者lambda的参数又是一个lambda表达式, 这样的函数就叫高阶函数 - 伴生对象
kotlin中没有静态方法, 想要实现像java中一样的静态方法需要使用伴生对象(companion object)
class FileUtil {
//在伴生对象中声明了一个静态方法
companion object {
fun checkFileName(name: String): String {
return name
}
}
}
//在kotlin中调用该方法, 类名.方法
fun main(){
FileUtil.checkFileName("aa")
}
//在java中调用kotlin中定义的方法, 类名.Companion.方法
public class TestFile {
public void test(){
FileUtil.Companion.checkFileName("aa");
}
}
伴生对象的作用, 可以使用伴生对象创建单例:
//将构造方法私有化
class CarFactory private constructor(){
companion object {
//通过伴生对象的方法创造一个内部类
fun getSingleton():CarFactory{
return Holder.instance
}
}
private object Holder{
var instance = CarFactory()
}
}
fun getCar(){
//直接获得单例对象
CarFactory.getSingleton()
}
网友评论