七、infix函数
使用infix函数构建更可读的语法
mapOf()函数,使用A to B的语法结构,to并不是Kotlin的关键字,之所以可以使用这种语法结构,是因为Kotlin提供了一种高级语法糖特性:infix函数,其实就是把编程语言函数调用的语法规则调整了一下,比如A to B这样的写法,实际上等价于A.to(B)的写法。
String类中有一个StartsWith()函数,它可以用于判断一个字符串是否是以某个指定的参数开头的。
if("hello Kotlin".startsWith("Hello")) {
//处理具体的逻辑
}
1
2
3
借助infix函数,我们可以使用一种更具可读性的语法来表达这段代码。新建一个infix.kt文件,编写一下代码
infix fun String.beginsWith(prefix: String) = startsWith(prefix)
1
加上infix关键字后,beginsWith()函数就变成了一个infix函数,这样除了传统的函数调用方式之外,还可以用一种特殊的语法糖格式调用beginsWith()函数
if("Hello Kotlin" beginsWith "Hello") {
//处理具体逻辑
}
1
2
3
infix函数允许我们将函数的小数点、括号等计算机相关的语法去掉,使用一种更接近英语的语法来编写程序,让代码更具可读性。
infix函数有两个比较严格的限制:infix函数是不能定义成顶层函数的,它必须是某个类的成员函数,可以使用扩展函数的方式将它定义到某个类当中;infix函数必须接收且只能接收一个参数。
一个集合,想要判断集合中是否包括某个指定元素,一般这样写
val list = listOf("Apple", "Banana", "Orange", "Pear", "Grape")
if(list.contains("Banana")) {
//处理具体逻辑
}
1
2
3
4
在infix.kt文件中添加如下代码
infix fun <T> Collection<T>.has(element: T) = contains(element)
1
我们给Collection接口添加了一个扩展函数,因为Collection是Java和Kotlin所有集合的总接口,因此给Collection添加一个has()函数,那么所有集合的子类就都可以使用这个函数了。
这里使用了泛型函数的定义方法,这样has()函数可以接收任意具体类型的参数。
于是判断集合中是否包括某个指定的元素可以改成
val list = listOf("Apple", "Banana", "Orange", "Pear", "Grape")
if(list has "Banana") {
//处理具体逻辑
}
1
2
3
4
mapOf()函数中允许我们使用A to B这样的语法来构建键值对,to()函数源码
public infix fun <A, B> A.to(that: B): Pair<A, B> = Pair(this, that)
1
这里使用泛型函数的定义方式将to()函数定义到A类型下,并且接收一个B类型的参数。因此A和B可以是两种不同类型的泛型,也就可以构建出字符串to整型这样的键值对。
to()函数的实现,创建并返回了一个Pair对象,而mapOf()函数实际上接收的正是一个Pair类型的可变参数列表。
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/bp1907/article/details/122333471