《Kotlin核心编程》 ——2.3.4 方法和成员引用
2.3.4 方法和成员引用
Kotlin存在一种特殊的语法,通过两个冒号来实现对于某个类的方法进行引用。以上面的代码为例,假如我们有一个CountryTest类的对象实例countryTest,如果要引用它的isBigEuropeanCountry方法,就可以这么写:
countryTest::isBigEuropeanCountry
为什么使用双冒号的语法?
如果你了解C#,会知道它也有类似的方法引用特性,只是语法上不同,是通过点号来实现的。然而,C#的这种方式存在二义性,容易让人混淆方法引用表达式与成员表达式,所以Kotlin采用::(沿袭了Java 8的习惯),能够让我们更加清晰地认识这种语法。
此外,我们还可以直接通过这种语法,来定义一个类的构造方法引用变量。
class Book(val name: String)
fun main(args: Array<String>) {
val getBook = ::Book
println(getBook("Dive into Kotlin").name)
}
可以发现,getBook的类型为(name: String) -> Book。类似的道理,如果我们要引用某个类中的成员变量,如Book类中的name,就可以这样引用:
Book::name
以上创建的Book::name的类型为(Book) -> String。当我们在对Book类对象的集合应用一些函数式API的时候,这会显得格外有用,比如:
fun main(args: Array<String>) {
val bookNames = listOf(
Book("Thinking in Java"),
Book("Dive into Kotlin")
).map(Book::name)
println(bookNames)
}
我们会在6.2节再次提到这种应用。
于是,Shaw便使用了方法引用来传递参数,以下的调用果真奏效了。
val countryApp = CountryApp()
val countryTest = CountryTest()
val countries = ……
countryApp.filterCountries(countries, countryTest::isBigEuropeanCountry)
经过重构后的程序显然比之前要优雅许多,程序可以根据任意的筛选需求,调用同一个filterCountries方法来获取国家数据。
- 点赞
- 收藏
- 关注作者
评论(0)