Home > Mobile >  How to convert a list object to other list object in kotlin
How to convert a list object to other list object in kotlin

Time:09-13

I have a list of products and a list of types, but to know what type the product belongs to I need to rely on the ID in the type list, so I need to convert it to a new NewProducts list and its type is a string, not a Integer.

data class Product(val id:String,val name:String,val price:Float,val type:Int)
data class Type(val id:Int,val name:String)

corresponding to the above data is the JSON snippet as below:

Products:

[
    {
        "id":1,
        "name":"Product 1",
        "price":3444,
        "type":1 
    },
    {
        "id":2,
        "name":"Product 2",
        "price":3444,
        "type":2 
    },
    {
        "id":3,
        "name":"Product 3",
        "price":3444,
        "type":3 
    },
    {
        "id":4,
        "name":"Product 4",
        "price":3444,
        "type":1 
    },
    {
        "id":5,
        "name":"Product 5",
        "price":3444,
        "type":2 
    }

]

and Type model:

[
    {
    "id": 1,
    "type": "A"
    },
    {
     "id": 2,
     "type": "B"
    },
    {
     "id": 3,
     "type": "C"
     },

]

So I want to convert them to a new object like this:

data class NewProduct(val id:String,val name:String,val price:Float,val type:String)

It looks like:

 var products = mutableListOf<Product>(
        Product("1", "Product 1", 34f, 1),
        Product("2", "Product 2", 34f, 2),
        Product("3", "Product 3", 34f, 3),
        Product("4", "Product 4", 34f, 1),
        Product("5", "Product 5", 34f, 2),
    )
    var types = mutableListOf<Type>(
        Type(1, "A"), Type(2, "B"),
        Type(3, "C"),
    )
    // i want to convert to NewProduct list
    products.map { products-> }

Can you help me with this problem?

CodePudding user response:

You can do

products.map { product ->
    NewProduct(
        product.id,
        product.name,
        product.price,
        types.first { type -> type.id == product.type }.name
    )
}

CodePudding user response:

You can first convert types into a map to access the types by id much faster:

val typeMap: Map<Int, String> = types.associateBy(Type::id, Type::name)

// {1=Type(id=1, name=A), 2=Type(id=2, name=B), 3=Type(id=3, name=C)}

Then map the products

val productsByType: List<NewProduct> = products.map {
        NewProduct(
            id = it.id,
            name = it.name,
            price = it.price,
            type = typeMap[it.type] ?: ""
        )
    }

/**
[NewProduct(id=1, name=Product 1, price=3444.0, type=A), 
 NewProduct(id=2, name=Product 2, price=3444.0, type=B), 
 NewProduct(id=3, name=Product 3, price=3444.0, type=C), 
 NewProduct(id=4, name=Product 4, price=3444.0, type=A), 
 NewProduct(id=5, name=Product 5, price=3444.0, type=B)]

*/

This way you can do it with a O(n) complexity.

  • Related