Filtering Collection In Kotlin

Filtering conditions are defined by predicate and lambda function takes collection element . it return true when given element matches to predicate , return false if doesn't matches.

Filter by predicate

use filter() to filtering. it returns collection element that matches with predicate. for list and set resulting collection is list, for map it returns map.

fun main(args: Array<String>) {
    val numbers1 = listOf(1,2,3,4,5,6)
    val numbers2 = listOf(0,5,3,4,3,2)

    // return list  of elemenet that if number1's elements present in number2 list 
    val filterNum = numbers1.filter { predicate ->
           numbers2.contains(predicate)
    }
    print(filterNum) //[2, 3, 4, 5]

    val numMap = mapOf("key1" to 1, "key2" to 2, "key3" to 3, "key11" to 11)
    val filterMap = numMap.filter { (key ,value) ->
        key.startsWith("k") && value >2
    }
    print(filterMap) // {key3=3, key11=11}
}

filterIndexed() to use elements position

fun main(args: Array<String>) {
    val numbers1 = listOf(1,2,3,4,5,6) 
   val filterIndexed = numbers1.filterIndexed {
         index,element -> (index>1) && element > 2
     }
     print(filterIndexed) // [3, 4, 5, 6] 
}

filterNot() to filter collection on false condition ,

fun main(args: Array<String>) {
    val numbers1 = listOf(1,2,3,4,5,6) 
     val f = numbers1.filterNot { 
         it > 3
      } 
      print(f) // [1, 2, 3] 
}

filterIsInstance() allow us to call functions of T type on its items

fun main(args: Array<String>) {
    val numbers3 = listOf("1",null, "Hello", "World","3.20")
    val filter3= numbers3.filterIsInstance<String>().forEach  {
        print(it.uppercase()+ " " )  // 1 HELLO WORLD 3.20
    }
    print(filter3) //  kotlin.Unit 
}

filterNotNull() returns all non-null elements

fun main(args: Array<String>) {
    val numbers4 = listOf("1",null, "Hello", "World","3.20")
    val filter4 = numbers4.filterNotNull().forEach{
        print(it + " ") // 1 Hello World 3.20
    }
    println(filter4) //  kotlin.Unit
}

Partition

it returns pair of list , first melements are matches in seperate and that are not matched goes in another list

 val numbers5 = listOf("one", "two", "three", "four", "five")
    val (matched, rest) = numbers5.partition { predicate -> predicate.length>3 }
    println(matched) // [three, four, five]
    println(rest) // [one, two]

Test predicates

these are function used for test a predicate against element

any() : It returns true if at least one element matches

none() : It returns true if no elements matches with given predicate , if matches then return false

all() : It returns true if all element matches with given predicate

 println(numbers5.any{ it.startsWith("t")}) // true 
 println(numbers5.none{ it.startsWith("o")}) //false
 println(numbers5.all { it.length > 3}) // false 

// all() returns true for any predicate for emptylist 
 println(emptyList<Int>().all { it > 5 }) // true

any() ,none() for without predicate

any() - return true if elements in list , false for empty list

none() -> return true if elements present in list , true for empty list

    println(numbers5.any()) // true 
    println(emptyList<Int>().any()) // false 

    println(numbers5.none()) // false 
    println(emptyList<Int>().none()) // true

Did you find this article valuable?

Support sanjay prajapat by becoming a sponsor. Any amount is appreciated!