DEV Community

Sanjay Prajapat
Sanjay Prajapat

Posted on • Edited on • Originally published at sanjayprajapat.hashnode.dev

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}
}
Enter fullscreen mode Exit fullscreen mode

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] 
}
Enter fullscreen mode Exit fullscreen mode

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] 
}
Enter fullscreen mode Exit fullscreen mode

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 
}
Enter fullscreen mode Exit fullscreen mode

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
}
Enter fullscreen mode Exit fullscreen mode

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]  

Enter fullscreen mode Exit fullscreen mode

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 

Enter fullscreen mode Exit fullscreen mode

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 
Enter fullscreen mode Exit fullscreen mode

Top comments (0)