美文网首页
Kotlin学习之常用高阶函数:filter

Kotlin学习之常用高阶函数:filter

作者: 程序员丶星霖 | 来源:发表于2018-01-03 17:14 被阅读660次

    Kotlin学习之常用高阶函数:filter

    Kotlin高阶函数一般是数组、集合、序列等数据结构的扩展函数,接收一个操作函数对数据进行操作,在Kotlin函数式编程中占有重要的地位。

    一、filter系列

    filter是“过滤器”的意思,Kotlin提供了多个相似的高阶函数。

    inline fun Array<out T>.filter(predicate: (T) -> Boolean): List<T> {
      return filterTo(ArrayList<T>(), predicate)
    }
    

    这是扩展Array<out T>的filter函数,它接受一个(T)->Boolean类型的函数,返回List<T>。但是它并不自己执行操作,而是新建一个ArrayList作为操作目标,然后把这个ArrayList和传入函数打包送给filterTo函数处理:

    inline fun <T, C : MutableCollection<in T>> Array<out T>.filterTo(destination: C, predicate: (T) -> Boolean): C {
      for(element in this) {
        if(predicate(element)) {
          destination.add(element)
        }
      }
      return destination
    }
    

    filterTo()函数会遍历数组内的元素,验证每个元素是否符合predicate函数,如果符合就把它添加到目标集合destination中,也就是说filter函数返回所有传入函数为true的元素。

    与filter相似的还有以下几个:

    • filterNot()filterNotTo():与filter相反,这两个函数会过滤出不符合条件的元素;
    • filterIndexed()filterIndexedTo():这两个函数接受(Int,T)->Boolean类型的函数,同时检查索引和元素是否符合条件;
    • filterNotNull()filterNotNullTo():这两个函数都会过滤出非空元素;
    • filterIsInstance()filterIsInstanceTo():这两个函数都能过滤出特定类型的元素,可以指定一个Class对象。

    二、示例

    给一个长度为 n 的数组,每个元素都在 [1,n] 之间,要求找出 [1,n] 中没有在数组里出现的元素。

    代码如下:

    fun findDisappearNumbers(nums: IntArray): List<Int> {
        val ifAppear = BooleanArray(nums.size + 1)
        nums.forEach { ifAppear[it] = true }
        return ifAppear.mapIndexed {
            index, boolean ->
            if (boolean || index == 0) -1 else index
        }.filter { it != -1 }
    }
    

    解释:

    1. 首先定义一个长度为nums长度+1的Boolean数组ifAppear(BooleanArray与Java的boolean[]相同,默认值为false)
    2. 通过forEach()函数遍历传入数组,将ifAppear数组中下标等于nums元素的项设为true
    3. 使用mapIndexed()函数将ifAppear的元素映射到一个新的List里,如果index为0或者值为true,就映射为-1,否则映射为下标;最后用filter过滤出所有不为-1的元素,返回过滤后的List。

    如果是使用Java,,我们就需要两次for循环,分别遍历nums和ifAppear,而Kotlin通过函数式编程,把循环封装在高阶函数内部,这样既有利于简化代码,降低出错的概率,更利于多线程和协程的实现

    学海无涯苦作舟

    我的微信公众号.jpg

    相关文章

      网友评论

          本文标题:Kotlin学习之常用高阶函数:filter

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