skip to Main Content

i have the following code:

            myList.find { it.code == item.bin }.let {
               // 1

            } ?: run {
               // 2
                
            }

I would expect that, if item is found, I enter block 1 , otherwise block 2 ;
But instead I enter block 1 in all cases, and if nothing is found , it is null

Android studio seems aware of this, as the block 2 is grey (it is code never called), but I can’t figure why

Please may someone explain why ?

2

Answers


  1. null is still a value so it makes sense that the first block is run. it’d be the same as if you ran null.let { println("hey!") }.

    you probably want to run let with a null check: myList.find { it.code == item.bin }?.let { ... }. this way the block will only run if there is indeed a value being returned that is not null.

    Login or Signup to reply.
  2. You are using classic dot call operator ., this operator is not allowed on nullable types. If you want to call this operator on nullable type insert !! before operator, but if you call it on null it throws NullPointerException

    You have to use Kotlins safe call operator ?., which call method when insatce is not null and when is it returns null.

    ?: operator is called Elvis operator and it returns first value if it is not null, else it returns second value.

    So just change in your code dot operator . to safe call operator ?.:

    myList.find { it.code == item.bin }.let {
                   // 1
    
                } ?: run {
                   // 2
                    
                }
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search