Filtering Collection In Kotlin
Tags: kotlin, collection, filter, programming
Published: 2021-09-04 19:22:00

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.

```kotlin
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 
```kotlin
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 ,  
```kotlin
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

```kotlin
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
```kotlin
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 
```kotlin
 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 

```kotlin
 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 

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

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