Nitt
Nitt

Reputation: 1923

How can I filter an ArrayList in Kotlin so I only have elements which match my condition?

I have an array:

var month: List<String> = arrayListOf("January", "February", "March")

I have to filter the list so I am left with only "January".

Upvotes: 111

Views: 200999

Answers (7)

krunal bakhal
krunal bakhal

Reputation: 11

list = list.filter {
            if (it.user.isNullOrEmpty()) {
                return@filter false
            } else if (!it.user.isNullOrEmpty()) {
                return@filter it.user != "guardian"
            }
            return@filter false
        }

Upvotes: 1

Samiran
Samiran

Reputation: 2954

Filtering by predicate

    val numbers = listOf("one", "two", "three", "four")
    var items: List<String> = numbers.filter { s -> s == "one" }

    var item = numbers.singleOrNull { it == "one" }

    if (item != null) {
        print("FOUND:$item")
    } else {
        print("Not FOUND!")
    }

Upvotes: 5

Nithinlal
Nithinlal

Reputation: 5061

You can use this code to filter out January from array, by using this code

var month: List<String> = arrayListOf("January", "February", "March")
// to get the result as list
var monthList: List<String> = month.filter { s -> s == "January" }

// to get a string
var selectedMonth: String = month.filter { s -> s == "January" }.single()

Upvotes: 181

Rishabh876
Rishabh876

Reputation: 3180

You can also use find or findLast. This is specifically meant to return only one value instead of a list of String returned in case of filter.

var month = arrayListOf("January", "February", "March")
var result = month.find { s -> s == "January" }

Upvotes: 8

Mohit Suthar
Mohit Suthar

Reputation: 9375

I am just sharing that if you have custom list and check whether it is null or blank you can check in Kotlin in single line Just do it like that

  fun filterList(listCutom: List<Custom>?) {
    var fiterList = listCutom!!.filter { it.label != "" }
    //Here you can get the list which is not having any kind of lable blank
  }

You can check multiple conditions also

 fun filterList(listCutom: List<Custom>?) {
    var fiterList = listCutom!!.filter { it.label != "" && it.value != ""}
    //Here you can get the list which is not having any kind of lable or value blank
  }

Note : I am assuming that label & value are the variables of Custom Model class.

Upvotes: 13

zsmb13
zsmb13

Reputation: 89548

There are a number of functions for filtering collections, if you want to keep only values matching "January", you can use the simple filter():

val months = listOf("January", "February", "March")

months.filter { month -> month == "January" } // with explicit parameter name
months.filter { it == "January" }             // with implicit parameter name "it"

These will give you a list containing only "January".

If you want all months that are not "January", you can either reverse the condition using !=, or use filterNot():

months.filter { it != "January" }
months.filterNot { it == "January" } 

These will give you a list containing "February" and "March".

Note that unlike Java, using the == and != operators in Kotlin is actually the same as calling the equals function on the objects. For more, see the docs about equality.

For the complete list of collection functions in the standard library, see the API reference.

Upvotes: 47

Avijit Karmakar
Avijit Karmakar

Reputation: 9388

You want to filter this list of Strings containing months.

var month : List<String> = arrayListOf("January", "February", "March")

You can use filterNot() method of list. It returns a list containing all elements except the given predicate.

var filteredMonthList : List<String> = month.filterNot { s -> s == "January" }
// results:  ["February", "March"]

You can use filter() method of list. It returns a list containing all elements matching the given predicate.

var filteredMonthList : List<String> = month.filter { s -> s == "January" }
// results:  ["January"]

After filter() if we use single() method then it will return a single value and throw an exception if more than one value is in the list.

var filteredMonth : String = month.filter { s -> s == "January" }.single()
// result:  "January"

Upvotes: 28

Related Questions