How to convert/transform a collection to another collection by element's property?

CollectionsFilterKotlin

Collections Problem Overview


If I have a collection of an object in Kotlin, is there a quick way to get a collection of a certain property of those objects? I looked at a list of collection operations for Kotlin, but nothing stood out for me (but I may have overlooked something)

In python it would be akin to:

[person.name for person in persons]

And I'd prefer to use a collections function instead of doing:

var nameMap = mutableListOf<String>()
persons.forEach{person -> nameMap.add(person.name)}

I'm pretty lacking in knowledge of filtering/lambda functions and anything other than list comprehension, so apologies if this is a simple question

Collections Solutions


Solution 1 - Collections

it's easy to do in Kotlin:

//           v--- the variable type can be removed
var nameMap: MutableList<String> = persons.map { it.name }.toMutableList();

IF you want an immutable List, it can simplify as below:

//           v--- the variable type can be removed
var nameMap: List<String> = persons.map { it.name };

OR using function reference expression instead:

var nameMap = persons.map(Person::name);

Solution 2 - Collections

If you want to map model then do this.

var nameMap: List<Model> = persons.map { Model(it.name,it.number) };

Solution 3 - Collections

Option 1:

inline fun <reified T, Y> MutableList<T>.listOfField(property: KMutableProperty1<T, Y?>): MutableList<Y> {
    val yy = ArrayList<Y>()
    this.forEach { t: T ->
        yy.add(property.get(t) as Y)
    }
    return yy
}

Usage:

val serviceIds = services.listOfField(ServiceModel::id)

Option 2:

var serviceIds: MutableList<String> = services.map { it.id }.toMutableList()

Option 3:

Function Reference

var serviceIds = services.map(Person::id)

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionParkerView Question on Stackoverflow
Solution 1 - Collectionsholi-javaView Answer on Stackoverflow
Solution 2 - CollectionsKhemraj SharmaView Answer on Stackoverflow
Solution 3 - CollectionsAnoop M MaddasseriView Answer on Stackoverflow