Johann
Johann

Reputation: 29867

Simplify testing of a null variable in an IF statement

In Kotlin I have this (which will not compile):

var list: MutableList<String>? = null

if (list.isNotEmpty()) {

}

This will compile:

var list: MutableList<String>? = null

if (list!!.isNotEmpty()) {

}

However, if list is null, a runtime exception will occur. I could do this:

var list: MutableList<String>? = null

if ((list != null) && list.isNotEmpty()) {

}

But this seems to be repetitive everywhere you need to test if something is null. Is there a more eloquent way of doing this in Kotlin?

Upvotes: 1

Views: 978

Answers (4)

Harikrishnan S
Harikrishnan S

Reputation: 11

For a list, it's better to avoid handling null state instead handle only empty and non-empty state. refer http://thefinestartist.com/effective-java/43.

Saying that, we don't need to explicitly check for null check and only empty check alone should do the trick.

var list : MutableList<String> = mutableListOf()
list.add("Test1")
list.takeIf { it.isNotEmpty() }?.forEach { println(it) }

We can use

takeIf

to check whether the list is empty or not.

Upvotes: 1

Roland
Roland

Reputation: 23242

I think most can be done with the safe operator ?. itself. So if you just want to iterate over the list (or reduce, map, or whatever), you can just simply do so directly:

val sumExpression = list?.joinToString("+") { it.someValue } ?: throw exception? use default value?
list?.forEach { println("an entry in the list: $it") } // if there are entries, just iterate over them... if not, there is nothing to do
list?.also {
   consume(it) // consume now is only called if the list is not null
}

Enhancing it then with a condition is also rather easy with takeIf or takeUnless (depending on what you require):

list?.takeIf { it.isNotEmpty() }

Now you still have a nullable list and can again call any of the desired functions as shown before:

list?.takeIf( it.isNotEmpty() }?.also {
  consume(it)
}

Also a variant instead of list.isNullOrEmpty() (already shown by gpuntos answer) is to compare the possible null value to the expected outcome, e.g.:

if(list?.isNotEmpty() == true) {
  // do something with the non-empty list
}

In case it is null the condition simplifies to basically null == true which is false. However I wouldn't overuse that too much as then you don't see the actual nullable types so easily anymore. Such a usage may make sense, if what you are trying to calculate isn't already supported in its own extension function (as is with isNullOrEmpty()), e.g. for entering the if only if the count is 4 it makes sense to use something like: if (list?.count() == 4)...

Upvotes: 0

Jasurbek
Jasurbek

Reputation: 2966

The first way add this line

list = list?:MutableList<String>()

Second way

val isEmpty = list.isEmpty()?:false

if(isEmpty){}else{}

Third way

if (!list.isNullOrEmpty()) 

as @AndroidDev suggested

Why are getting an error? Since !! require non-null. if the object is null then it will throw NPE

Upvotes: 0

gpunto
gpunto

Reputation: 2822

In the specific case of checking if the list is not null or empty you can use:

if (!list.isNullOrEmpty())

Upvotes: 3

Related Questions