Covert list to Map with list in Kotlin

Advertisements

This might be a common question, but I did not find anything specific to what I am looking for. Also, I am newbie to Kotlin.

Here is my existing code that I want to simplify in Kotlin. The below code is in Java and I am looking for Kotlin equivalent of it

Travserse through the list of items, identify if it contains MEAT or EGG and accordingly put it in a Map with a LIST. The key to MAP is MEAT/VEG.

final Map<TYPE, List<String>> itemtypeToContent = new HashMap<>();
        itemtypeToContent.put(TYPE.MEAT, new ArrayList<>());
        itemtypeToContent.put(TYPE.VEG, new ArrayList<>());

        foodList.forEach(item -> {
            if (containsMeat(item)) {
                itemtypeToContent.get(TYPE.MEAT).add(item);
            } else if (containsEgg(item)) {
                itemtypeToContent.get(TYPE.VEG).add(item);
            } else {
                // log invalid item - skip
            }
        });
        return itemtypeToContent;



enum TYPE {
MEAT,
VEG
}

class Item {
String name,
List<String> ingredients
}

input:

List<Item> foodList = {{Omlette, {egg, onion, salt, pepper, mushroom}},
                       {ScrambledEggs, {egg, milk, salt, pepper}},
                       {ChickenTacos, {chicken, onion, salt}}
                       {Fries, {potatoes, salt}}}

output:

Map {MEAT, [{ChickenTacos, {chicken, onion, salt}}]
     VEG,  [{Omlette, {egg, onion, salt, pepper, mushroom}},
            {ScrambledEggs, {egg, milk, salt, pepper}}]}

We skipped FRIES because it did not contain meat or egg

>Solution :

You basically want to categorise dishes based on whether they contain meat or not, so assuming you only have 2 categories you can do it like this

fun main() {
    val dishes = listOf(
        Dish("Omelette", listOf("egg", "onion", "salt", "pepper", "mushroom")),
        Dish("ChickenTacos", listOf("chicken", "onion", "salt")),
        Dish("ScrambledEggs", listOf("egg", "milk", "salt", "pepper")),
        Dish("Fries", listOf("potatoes", "salt"))
    )

    val grouped = dishes.groupBy {
        when {
            containsMeat(it) -> IngredientType.MEAT
            containsVeg(it) -> IngredientType.VEG
            else -> null
        }
    }
        .filterKeys { it != null }


    println(grouped)
}

This prints:

{
    VEG=[Dish(name=Omelette, ingredients=[egg, onion, salt, pepper, mushroom]), Dish(name=ScrambledEggs, ingredients=[egg, milk, salt, pepper])],
    MEAT=[Dish(name=ChickenTacos, ingredients=[chicken, onion, salt])]
}

Leave a Reply Cancel reply