📖 Scenario: Imagine you are building a simple app that processes user comments. Sometimes, the comment text might be missing (null). You want to safely check if a comment is empty or not, even if the comment itself is null.
🎯 Goal: Create a Kotlin extension function with a nullable receiver that checks if a string is null or empty. Then use it to safely check comments.
📋 What You'll Learn
Create a nullable receiver extension function called isNullOrEmptyCustom for String?
The function should return true if the string is null or empty, otherwise false
Create a list of nullable strings called comments with exact values: "Hello", "", null, "Kotlin"
Use a for loop with variables comment to iterate over comments
Inside the loop, print "Empty or null" if comment.isNullOrEmptyCustom() is true, else print the comment text
💡 Why This Matters
🌍 Real World
Nullable receiver extensions help safely add functions to types that can be null, avoiding crashes and making code cleaner.
💼 Career
Understanding nullable receiver extensions is important for Kotlin developers to write safe and readable code, especially when dealing with optional data.
Progress0 / 4 steps
1
Create the list of nullable comments
Create a list called comments with these exact nullable string values: "Hello", "", null, "Kotlin"
Kotlin
Hint
Use listOf to create a list with nullable strings.
2
Create the nullable receiver extension function
Create an extension function called isNullOrEmptyCustom with a nullable String? receiver that returns true if the string is null or empty, otherwise false
Kotlin
Hint
Use fun String?.isNullOrEmptyCustom() to define the extension function with nullable receiver.
3
Use a for loop to check each comment
Use a for loop with variable comment to iterate over comments. Inside the loop, use comment.isNullOrEmptyCustom() to check if the comment is empty or null.
Kotlin
Hint
Use for (comment in comments) to loop, then if (comment.isNullOrEmptyCustom()) to check.
4
Print the results
Print the output inside the loop as specified: print "Empty or null" if comment.isNullOrEmptyCustom() is true, otherwise print the comment text.
Kotlin
Hint
Use println to print the correct output inside the loop.
Practice
(1/5)
1. What is the main benefit of using nullable receiver extensions in Kotlin?
easy
A. They prevent any null values from being assigned.
B. They make variables non-nullable automatically.
C. They convert nullable types to non-nullable types permanently.
D. They allow calling functions on nullable types without explicit null checks.
Solution
Step 1: Understand nullable receiver extensions
Nullable receiver extensions let you add functions to types that can be null, so you can call these functions safely without extra null checks.
Step 2: Identify the benefit
This means you can write cleaner code by calling functions directly on nullable objects without risking null pointer exceptions.
Final Answer:
They allow calling functions on nullable types without explicit null checks. -> Option D
Quick Check:
Nullable receiver extensions = call on nullable safely [OK]
Hint: Nullable extensions handle null inside function, no extra checks needed [OK]
Common Mistakes:
Thinking they convert nullable to non-nullable permanently
Assuming they prevent null assignments
Confusing with regular extensions on non-null types
2. Which of the following is the correct syntax to define a nullable receiver extension function isNullOrEmpty for String? in Kotlin?
easy
A. fun String.isNullOrEmpty(): Boolean = this == null || this.isEmpty()
B. fun String.isNullOrEmpty?(): Boolean = this == null || this.isEmpty()
C. fun String?.isNullOrEmpty(): Boolean = this == null || this.isEmpty()
D. fun String?.isNullOrEmpty?(): Boolean = this == null || this.isEmpty()
Solution
Step 1: Identify nullable receiver syntax
To define an extension on a nullable type, use String? as the receiver type with a question mark after the type name.
Step 2: Check function syntax
The function name should not have a question mark. So fun String?.isNullOrEmpty() is correct.
Final Answer:
fun String?.isNullOrEmpty(): Boolean = this == null || this.isEmpty() -> Option C
Quick Check:
Nullable receiver = question mark after type [OK]
Hint: Nullable receiver extension uses ? after type, not after function name [OK]
Common Mistakes:
Putting ? after function name instead of receiver type
Missing ? on receiver type for nullable
Using non-nullable receiver for nullable extension
3. What will be the output of the following Kotlin code?
fun String?.describe(): String = this ?: "Empty"
fun main() {
val text1: String? = "Hello"
val text2: String? = null
println(text1.describe())
println(text2.describe())
}
medium
A. Hello\nEmpty
B. Hello\nnull
C. null\nEmpty
D. Empty\nEmpty
Solution
Step 1: Understand the extension function behavior
The function returns the string itself if not null, otherwise returns "Empty".
Step 2: Apply to variables
text1 is "Hello", so describe() returns "Hello". text2 is null, so describe() returns "Empty".
Final Answer:
Hello\nEmpty -> Option A
Quick Check:
Nullable describe returns value or "Empty" [OK]
Hint: ?: operator returns left if not null, else right [OK]
Common Mistakes:
Assuming null prints as "null" string
Confusing ?: with !! operator
Expecting function to throw on null
4. Identify the error in this Kotlin code using a nullable receiver extension:
fun String?.firstChar(): Char = this[0]
fun main() {
val s: String? = null
println(s.firstChar())
}
medium
A. Compilation error: Extension function syntax incorrect
B. Compilation error: Cannot call get(0) on nullable receiver without null check
C. No error, prints first character or null
D. Runtime exception: NullPointerException when calling firstChar on null
Solution
Step 1: Analyze extension function code
The function calls this[0] on a nullable receiver String? without a null check or safe call.
Step 2: Understand compiler behavior
Kotlin compiler detects the unsafe access on nullable receiver and produces a compilation error.
Final Answer:
Compilation error: Cannot call get(0) on nullable receiver without null check -> Option B
Quick Check:
Unsafe access on nullable receiver = compile error [OK]
Hint: Nullable receiver extensions must check for null before use [OK]
Common Mistakes:
Assuming nullable receiver is auto-checked
Thinking it causes runtime exception instead of compilation error
Thinking it compiles and prints null instead of error
5. You want to create a nullable receiver extension safeLength() for String? that returns the string length or zero if null. Which implementation is correct and safe?
1) fun String?.safeLength() = this.length ?: 0
2) fun String?.safeLength() = this?.length ?: 0
3) fun String.safeLength() = this.length ?: 0
4) fun String?.safeLength() = if (this == null) null else this.length
hard
A. Option 2
B. Option 1
C. Option 3
D. Option 4
Solution
Step 1: Check each option for null safety
Option 1 calls this.length directly on nullable this, causing error. Option 3 uses non-nullable receiver, so not valid for nullable. Option 4 returns null instead of Int zero.
Step 2: Identify correct safe call usage
Option 2 uses safe call this?.length which returns length or null, then ?: 0 returns zero if null. This is safe and returns Int.
Final Answer:
fun String?.safeLength() = this?.length ?: 0 -> Option A
Quick Check:
Safe call ?. with ?: zero fallback is correct pattern [OK]
Hint: Use safe call ?. and ?: to handle nullable safely [OK]
Common Mistakes:
Calling length directly on nullable without safe call
Using non-nullable receiver for nullable extension
Returning null instead of zero for null input
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.