📖 Scenario: You are building a simple contact list app. Some contacts may have missing phone numbers, so you need to handle null values safely in your list of contacts.
🎯 Goal: Create a list of contacts where some phone numbers can be null. Then, filter out the contacts without phone numbers using Kotlin's null safety features.
📋 What You'll Learn
Create a list of contacts with names and nullable phone numbers
Create a variable to hold the filtered list of contacts with non-null phone numbers
Use Kotlin's safe call operator and filtering to keep only contacts with phone numbers
Print the filtered list of contacts
💡 Why This Matters
🌍 Real World
Handling contact lists or any data where some information might be missing is common in apps like phonebooks, messaging, or customer management.
💼 Career
Understanding null safety in collections helps prevent crashes and bugs in real-world Kotlin applications, a key skill for Android developers and backend Kotlin programmers.
Progress0 / 4 steps
1
Create a list of contacts with nullable phone numbers
Create a list called contacts with these exact entries: "Alice" to "123-4567", "Bob" to null, "Charlie" to "987-6543", and "Diana" to null. Use a list of pairs where the second value can be null.
Kotlin
Hint
Use listOf with pairs like "Name" to phoneNumber. Phone numbers can be null.
2
Create a variable to hold filtered contacts
Create a variable called contactsWithPhone and set it to an empty list of pairs with String and nullable String types.
Kotlin
Hint
Use var contactsWithPhone: List> = listOf() to create an empty list with the right type.
3
Filter contacts to keep only those with phone numbers
Set contactsWithPhone to a filtered list from contacts that keeps only pairs where the phone number (second value) is not null. Use filter and check it.second != null.
Kotlin
Hint
Use contacts.filter { it.second != null } to keep only contacts with phone numbers.
4
Print the filtered contacts
Print contactsWithPhone using println to show the contacts that have phone numbers.
Kotlin
Hint
Use println(contactsWithPhone) to display the filtered list.
Practice
(1/5)
1. What does Kotlin's null safety feature ensure when working with collections like List or Set?
easy
A. It prevents storing null values in collections declared without nullable types.
B. It automatically converts all null values to empty strings in collections.
C. It allows null values in any collection without restrictions.
D. It disables the use of collections if they contain null values.
Solution
Step 1: Understand Kotlin's null safety in collections
Kotlin distinguishes between nullable and non-nullable types. Collections declared with non-nullable types cannot hold null values.
Step 2: Apply this to collection elements
If a collection is declared as List<String>, it cannot contain null. To allow null, it must be declared as List<String?>.
Final Answer:
It prevents storing null values in collections declared without nullable types. -> Option A
Quick Check:
Null safety = no null in non-nullable collections [OK]
Hint: Non-nullable collections disallow null elements [OK]
Common Mistakes:
Assuming all collections allow null by default
Confusing null safety with automatic null replacement
Thinking null safety disables collections with nulls
2. Which of the following is the correct way to declare a list that can hold nullable integers in Kotlin?
easy
A. val numbers: List<Int> = listOf(1, 2, null)
B. val numbers: List<Int> = listOf(null, null, null)
C. val numbers: List = listOf(1, 2, 3)
D. val numbers: List = listOf(1, 2, null)
Solution
Step 1: Identify nullable type declaration
To allow null in a list, the element type must be nullable, written as Int?.
Step 2: Check list initialization
listOf(1, 2, null) is valid only if the list type is List<Int?>. val numbers: List = listOf(1, 2, null) matches this.
Final Answer:
val numbers: List<Int?> = listOf(1, 2, null) -> Option D
Quick Check:
Nullable type uses Int? for null elements [OK]
Hint: Use Type? to allow nulls in collections [OK]
Common Mistakes:
Declaring list as List<Int> but adding nulls
Using List<Int> with null elements causes error
Confusing nullable element type with nullable list
3. What will be the output of the following Kotlin code?
val list: List = listOf("apple", null, "banana")
val filtered = list.filterNotNull()
println(filtered)
medium
A. ["apple", null, "banana"]
B. [null]
C. ["apple", "banana"]
D. Compilation error
Solution
Step 1: Understand filterNotNull() behavior
This function removes all null elements from a collection, returning a list of non-null elements.
Step 2: Apply filterNotNull() on the list
Original list has "apple", null, "banana". After filtering, only "apple" and "banana" remain.
Final Answer:
["apple", "banana"] -> Option C
Quick Check:
filterNotNull() removes nulls [OK]
Hint: filterNotNull() removes all nulls from collections [OK]
Common Mistakes:
Expecting nulls to remain after filterNotNull()
Thinking filterNotNull() causes compile error
Confusing filterNotNull() with filter()
4. Identify the error in this Kotlin code snippet:
val list: List<Int> = listOf(1, 2, null, 4)
medium
A. The list declaration syntax is incorrect.
B. The list cannot contain null because Int is non-nullable.
C. The listOf function cannot be used with integers.
D. There is no error; the code compiles fine.
Solution
Step 1: Check element type and values
The list is declared as List<Int>, which means elements cannot be null.
Step 2: Identify the presence of null
The list contains a null value, which is not allowed for non-nullable types, causing a compilation error.
Final Answer:
The list cannot contain null because Int is non-nullable. -> Option B
Quick Check:
Non-nullable list disallows null elements [OK]
Hint: Non-nullable types disallow null values in collections [OK]
Common Mistakes:
Assuming null is allowed in List<Int>
Thinking listOf syntax is wrong
Ignoring Kotlin's null safety rules
5. Given a list of nullable strings val items: List = listOf("a", null, "b", null, "c"), how can you create a map where keys are the strings and values are their lengths, excluding null values safely?
hard
A. items.filterNotNull().associateWith { it.length }
B. items.associateWith { it!!.length }
C. items.associate { it to it.length }
D. items.map { it.length }.toMap()
Solution
Step 1: Remove null values safely
Use filterNotNull() to exclude null elements before mapping.
Step 2: Create map with strings as keys and lengths as values
Use associateWith { it.length } on the filtered list to map each string to its length.
Final Answer:
items.filterNotNull().associateWith { it.length } -> Option A
Quick Check:
Filter nulls first, then associate [OK]
Hint: Filter nulls before mapping to avoid errors [OK]
Common Mistakes:
Using !! operator risking NullPointerException
Trying to associate null keys or values
Mapping lengths without filtering nulls first
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.