sagar suri
sagar suri

Reputation: 4741

use map function on condition in kotlin

I have a list of items and I want to edit its values before using it. I am using the map function to update each item in it. But the catch here is, I want to only update the items when the list size is 1. I want to return the list as it is if the size is larger than 1. How can I achieve this?

myList.map {
      if(resources.getBoolean(R.bool.is_tablet) && it.itemList.size<6 && it.layerType == DOUBLE_LIST) {
        it.layerType = SINGLE_LIST_AUTO
        it.itemList.forEach {sectionItem->
          sectionItem.layerType = SINGLE_LIST_AUTO
        }
        it
      }else{
        it
      }
    }

Upvotes: 6

Views: 19492

Answers (3)

Jegan Babu
Jegan Babu

Reputation: 1396

I am assuming you want to modify the items in your list only if some conditions are met else return the same list unmodified.

You can consider using takeIf { } for this scenario if you desire to add some syntactic sugar

fun updateItemsInMyList(myList:List<SomeClass>): List<SomeClass> {
    return myList
        .takeIf {
            // condition to modify items in your list
            it.size > 1 && otherConditions
        }
        ?.apply {
           //update your items inside the list
        }
        ?: myList // return the unmodified list if conditions are not met
}

Upvotes: 4

Chrisvin Jem
Chrisvin Jem

Reputation: 4070

If I understand your question correctly, you want to check if myList contains only one value else, you want update the values and return it. You could do something along the following lines,

myList.singleOrNull ?: myList.map {
      if(resources.getBoolean(R.bool.is_tablet) && it.itemList.size<6 && it.layerType == DOUBLE_LIST) {
        it.layerType = SINGLE_LIST_AUTO
        it.itemList.forEach {sectionItem->
          sectionItem.layerType = SINGLE_LIST_AUTO
        }
        it
      }else{
        it
      }
    }
return myList

Basically, check if there's only a single value in the list, if so, then return the value. In the case that there isn't (you get null), then you can map the value.

Upvotes: 1

Alex
Alex

Reputation: 972

You can try using filter before map:

.filter { it.itemList.size == 1 }

Upvotes: 15

Related Questions