美文网首页我爱编程
Kotlin 函数2 - 中缀函数

Kotlin 函数2 - 中缀函数

作者: ChenME | 来源:发表于2018-07-26 11:34 被阅读104次

    Kotlin 函数2 - 中缀函数


    如果一个函数只有一个参数,且用 infix 修饰,那么这个函数就是中缀函数

    • 提到中缀表达式,想到之前看到的一个例子,就是求两个集合的交集

    [1, 2, 3, 4, 5, 6] ∩ [4, 5, 6, 7, 8, 9, 0] 的结果就是 [4, 5, 6],就拿这个例子来说明中缀表达式

    1. 首先对 List 集合添加一个扩展方法 getIntersection(), 用来求两个集合的交集
    fun <T> List<T>.getIntersection(other: List<T>): List<T> {
        val result = ArrayList<T>()
        forEach {
            if (other.contains(it)) {
                result.add(it)
            }
        }
        return result
    }
    
    1. 来调用一下试试
    var list1 = arrayOf(1, 2, 3, 4, 5, 6)
    var list2 = arrayOf(4, 5, 6, 7, 8, 9, 0)
    var result = list1.toList().getIntersection(list2.toList())
    result.forEach { print("$it, ") } // 4, 5, 6,
    
    1. 与想象中的一样,如愿所偿的拿到了正确的结果。
    • 但是能不能像数学运算式子一样,将 list1.toList().getIntersection(list2.toList()) 改写的更直观一些,像这样 [1, 2, 3, 4, 5, 6] ∩ [4, 5, 6, 7, 8, 9, 0] 呢?
    • 当然可以,中缀函数刚好帮到我们的忙;
    • fun 前面添加 infix 关键字,然后就可以像数学中的 + - * / 一样使用了。
    infix fun <T> List<T>.getIntersection(other: List<T>): List<T> {
        val result = ArrayList<T>()
        forEach {
            if (other.contains(it)) {
                result.add(it)
            }
        }
        return result
    }
    
    var result = list1.toList() getIntersection (list2.toList()) // 4, 5, 6,
    
    1. 看着还是不舒服,在把函数名改一下
    infix fun <T> List<T>.n(other: List<T>): List<T> {
        val result = ArrayList<T>()
        forEach {
            if (other.contains(it)) {
                result.add(it)
            }
        }
        return result
    }
    
    var result = list1.toList() n (list2.toList()) // 4, 5, 6,
    

    这样在使用的时候是不是更像是在写数学一样呢?

    1. 最后重申一下中缀函数的使用条件
    1. 必须是成员函数或者扩展函数;
    2. 必须只有一个参数;
    3. 参数不能是可变参数或默认参数;

    相关文章

      网友评论

        本文标题:Kotlin 函数2 - 中缀函数

        本文链接:https://www.haomeiwen.com/subject/tkzvmftx.html