Home > Back-end >  Kotlin Take within Apply scope not working in android
Kotlin Take within Apply scope not working in android

Time:12-07

So, I have a nullable Int that I need to use to truncate a list with "take". But when I do this, the list stays the same. Example:

var num: Int? = 1

var list = listOf("1", "2", "3")

// list remains as size 3
var newList = list.apply{
    num?.let {
        this.take(it)
    }
}

CodePudding user response:

This is perfectly normal, because take doesn't modify the input list; it returns a new copy of the selected elements.

The simplest way to write this code is:

val newList = if (num != null) list.take(num) else list

CodePudding user response:

The problem with your code isn't just that take returns a new list (that's true) but that you're using apply as scope function. apply returns this and not the result of the lambda, so no matter what you do in the lambda, newList will always be list.

The proposed solution is a good one. If you're a fan of scope functions you can also do

val newList = num?.let { list.take(it) } ?: list

which is exactly 7 character shorter than

val newList = if (num != null) list.take(num) else list
  • Related