Kotlin之字符串内嵌模式和函数参数默认值

1、字符串内嵌模式

在Kotlin中我们不需要像Java那样慢慢的拼接字符串,而是可以直接将表达式写在字符串里,即使构建非常复杂的字符串,也会变得轻而易举。
在Java中我们拼接字符串都是使用+进行拼接的,下面看下如何使用Kotlin的字符串内嵌模式来对字符串进行拼接。

val str = "hello ${person?.name} nice to meet you"

可以看到Kotlin允许我们在字符串里嵌入${}这种语法结构的表达式,并在运行时使用表达式运行结构替代这部分内容。另外当表达式中只有一个变量时还能剩去{},像上面这种${person?.name}有两个变量是不能省略{}

var name="树先生"
var content="hello ${name} nice to meet you"
//{}中只有一个变量,可省略{}
 content = "hello $name nice to meet you"

2、函数参数的默认值

在学习次构造函数时,我们提到过次构造函数一般使用不到,是因为Kotlin提供了给函数设定参数默认值的功能,它在很大程度上替代了次构造函数的作用。
具体来说,我们在定义函数时给任意参数设定一个默认值,这样在调用此函数时就不会强制传递该参数,在不传值的情况下就会使用默认值。

fun printParams(num: Int, str: String = "设置了默认值") {
        println("num is $num,str is $str")
    }
//调用函数的代码
printParams(12)

上面的例子比较理想化,我们给函数的最后一个参数设定了默认值,如果我们给第一个参数设定了默认值的话又会怎么样?

fun printParams(str: String = "设置了默认值", num: Int) {
        println("num is $num,str is $str")
    }
//调用函数的代码
printParams(12)

如果依然按照上面那样调用函数,你会发现编译失败,因为编译器默认将传入的参数12赋值给函数printParams()的第一个参数,而printParams()第一个参数是String类型,所以会因为类型不匹配导致编译失败。
为此,Kotlin提供了神奇的机制:可以通过键值对的形式传参,从而不必像传统写法那样按照顺序进行传参。比如调用printParams()函数,我们可以这么写:

printParams(num = 12,str="hello")

此时参数的顺序不再重要了,Kotlin可以精确的将参数匹配上。使用这种键值对传参后,我们就不需要传入已经设置了默认值的参数了。

fun printParams(str: String = "设置了默认值", num: Int) {
        println("num is $num,str is $str")
    }
//调用函数的代码
printParams(num = 12)

现在回过头来看下,为什么说函数设定参数默认值可以很大程度上替代次构造函数的使用,先看下次构造函数的使用场景。

class Student(val sno: String, val grade: Int, name: String, age: Int) : Person(name, age),Study {
    constructor(name: String, age: Int) : this("", 0, name, age) {    }
    constructor() : this("", 0) {    }
}

可以看到两个参数的次构造函数,通过this调用主构造函数并将缺失的两个参数初始为默认值,无参次构造函数会调用两个参数的次构造函数,并给这两个参数传入默认值,其实我们完全可以省略2个次构造函数,在主构造函数给参数设定默认值,这样就能实现任何场景了。

class Student(val sno: String = "", val grade: Int = 0, name: String = "", age: Int = 0) : Person(name, age), Study {
}

你可能感兴趣的:(Kotlin之字符串内嵌模式和函数参数默认值)