Kotlin collection interfaces offer a number of ways to filter data. Lambda expressions are at the core of a very elegant and readable coding style.
- [Instructor] In last week's tip, I described how to sort and calculate the values of collections. Now, I'll show you how to filter collections and how to combine that with sorting and other functions. I'm once again working with two different collections, stateList is a list of strings and shoppingCart is a list of complex objects. Instances of the class LineItem, which has references to the class ClothingItem. I'll start with a simple filter. Let's say I wanted to create a filtered list.
I'll create a new variable and I'll call it filteredList. I'll get its value by calling stateList and then from there, I'll call the function filter. This is asking for a lambda expression and specifically this function is looking for a Boolean value. Whatever code I pass in is going to be executed against each item in the list. If my code returns true, the item will be included in the filtered list and if it's false, it won't be included. I'll use the expression it.startsWith and then the uppercase M.
Then, as I've done before, I'll use a simple loop and this time I'm going to loop through filteredList and I'll output the name of the state. Now, I'm only listing states that start with the letter M, but you can actually combine filtering with other functions. For example, if I also wanted to sort the data, I can simply chain the calls together. The filter function returns a reference to this list, so from here I can call sortedBy, which I demonstrated last week, and this time instead of sorting alphabetically, I'm going to sort by the length of the string with it.length.
I'll run the code again and this time I'm filtering and sorting the data, and so when the data is displayed, the shortest state name will be displayed first and the longest last. There's the result. This filtering strategy can be applied to collections containing complex objects just as easily. In the lambda expression, just use whatever expression you need to reference the property on which you want to filter. For example, I'll go down here to where I'm working with my shoppingCart and I'll create a variable called filteredCart.
I'll start by calling the shoppingCart object and from there I'll call the filter function. For the lambda expression, I'll pass in it.clothingItem.clothingType equals clothingItem.SHIRT. Now, I know because I built the code that there's only going to be one item that satisfies that requirement. My filteredCart will have one and only one item in it. I'll get a reference to that LineItem with filtered.Cart.get and I'll pass in a value of zero.
Alternatively, you can use indexing syntax and it'll look like it's an array. Then, I'll output the item using my log function and I'll pass in item.toString. Now, the LineItem class is a data class and in Kotlin, the data class has a special feature. It generates a two-string function automatically. This will result in highly readable debug output that I can use to find out what really happened when I ran the application.
There's the result. I've retrieved one item from the shopping cart and it's the item that is a shirt. That's how easy it is to filter data collections in Kotlin. You don't need to write a lot of looping code and use a lot of Boolean evaluations. Instead, just use the functions that are parts of the collection interfaces, list, set, and map.
Skill Level Intermediate
Q: Why can't I earn a Certificate of Completion for this course?
A: We publish a new tutorial or tutorials for this course on a regular basis. We are unable to offer a Certificate of Completion because it is an ever-evolving course that is not designed to be completed. Check back often for new movies.