📖 Scenario: You are creating a simple program to manage a book's details. You want to update and display the book's information in a clean and readable way.
🎯 Goal: Build a Kotlin program that uses the with function to update and print the details of a book object.
📋 What You'll Learn
Create a data class called Book with properties title, author, and year
Create an instance of Book with initial values
Use the with function to update the book's year and print all details inside the with block
Print the book details outside the with block to confirm changes
💡 Why This Matters
🌍 Real World
Using the <code>with</code> function helps keep your code clean and readable when working with objects that need multiple operations.
💼 Career
Understanding <code>with</code> is useful for Kotlin developers to write concise and maintainable code, especially in Android app development and backend services.
Progress0 / 4 steps
1
Create the Book data class and an instance
Create a Kotlin data class called Book with properties title (String), author (String), and year (Int). Then create a variable myBook of type Book with title as "Kotlin Basics", author as "Jane Doe", and year as 2020.
Kotlin
Hint
Remember to use var for year because it will change later.
2
Add a variable for the new publication year
Create an Int variable called newYear and set it to 2023.
Kotlin
Hint
Use val newYear = 2023 to create the variable.
3
Use the with function to update and print book details
Use the Kotlin with function with myBook as the receiver. Inside the with block, update the year property to newYear and print the book details in the format: "Title: [title], Author: [author], Year: [year]".
Kotlin
Hint
Inside with(myBook) { }, you can access properties directly without myBook.
4
Print the updated book details outside the with block
Print the book details again outside the with block using println in the same format: "Title: [title], Author: [author], Year: [year]" to confirm the update.
Kotlin
Hint
Use println("Title: ${myBook.title}, Author: ${myBook.author}, Year: ${myBook.year}") to print outside the with block.
Practice
(1/5)
1. What is the main purpose of the with function in Kotlin?
easy
A. To define a new class inside a function
B. To create a new thread for concurrent execution
C. To execute multiple operations on the same object without repeating its name
D. To handle exceptions in a concise way
Solution
Step 1: Understand the role of with
The with function groups multiple calls on the same object, so you don't repeat the object name.
Step 2: Compare with other options
Options A, B, and D describe unrelated Kotlin features like class definition, threading, and exception handling.
Final Answer:
To execute multiple operations on the same object without repeating its name -> Option C
Quick Check:
with groups calls on one object = C [OK]
Hint: Remember: with avoids repeating object name [OK]
Common Mistakes:
Confusing with with threading or concurrency
Thinking with creates new classes
Assuming with handles exceptions
2. Which of the following is the correct syntax to use with in Kotlin?
easy
A. with(object) { /* code block */ }
B. with { object -> /* code block */ }
C. with object { /* code block */ }
D. with(object) -> { /* code block */ }
Solution
Step 1: Recall the syntax of with
The correct syntax is with(object) { /* code block */ }, where the object is passed as an argument and the block follows in braces.
Step 2: Identify incorrect syntax
Options B, C, and D misuse arrow notation or omit parentheses, which are syntax errors.
Final Answer:
with(object) { /* code block */ } -> Option A
Quick Check:
Correct with syntax uses parentheses and braces = A [OK]
Hint: Use parentheses for object, braces for block in with [OK]
Common Mistakes:
Omitting parentheses around the object
Using arrow notation incorrectly
Placing the block outside braces
3. What is the output of the following Kotlin code?
data class Person(var name: String, var age: Int)
fun main() {
val person = Person("Alice", 25)
val result = with(person) {
age += 1
"${name} is now $age years old"
}
println(result)
}
medium
A. Alice is now 25 years old
B. Runtime error due to modifying age
C. Compilation error due to string interpolation
D. Alice is now 26 years old
Solution
Step 1: Analyze the with block behavior
The with function uses person as the context. Inside, age is incremented by 1, changing it from 25 to 26.
Step 2: Evaluate the returned string
The last expression in the block is the string interpolation "${name} is now $age years old", which becomes "Alice is now 26 years old".
Final Answer:
Alice is now 26 years old -> Option D
Quick Check:
Age incremented inside with = D [OK]
Hint: Remember last expression in with is the return value [OK]
4. Identify the error in this Kotlin code using with:
fun main() {
val list = listOf(1, 2, 3)
with(list) {
add(4)
println(this)
}
}
medium
A. Cannot call add on an immutable list
B. Missing parentheses in with call
C. Incorrect use of this inside with
D. Print statement syntax error
Solution
Step 1: Check the list type and mutability
The list is created with listOf, which returns an immutable list that does not support add.
Step 2: Understand the error cause
Calling add(4) on an immutable list causes a compile-time error because the method is not available.
Final Answer:
Cannot call add on an immutable list -> Option A
Quick Check:
Immutable list blocks add method = A [OK]
Hint: Use mutableListOf to add elements, not listOf [OK]
Common Mistakes:
Assuming with changes mutability
Thinking this is incorrect inside with
Ignoring immutability of listOf
5. Given a mutable map of student names to scores, how can you use with to increase all scores by 5 points and return the updated map?
Choose the correct Kotlin code snippet.
hard
A. with(students) { keys.forEach { it += 5 }; this }
B. with(students) { for (key in keys) this[key] = this[key]!! + 5; this }
C. with(students) { mapValues { it.value + 5 } }
D. with(students) { forEach { it.value += 5 }; this }
Solution
Step 1: Understand map mutability and with usage
The map is mutable, so we can update values by keys inside with. with(students) { for (key in keys) this[key] = this[key]!! + 5; this } correctly loops keys and updates values.
Step 2: Analyze other options for correctness
with(students) { keys.forEach { it += 5 }; this } tries to add 5 to keys (strings), which is invalid. with(students) { mapValues { it.value + 5 } } returns a new map but does not update original. with(students) { forEach { it.value += 5 }; this } tries to modify it.value in forEach, but map entries are immutable in this context.
Final Answer:
with(students) { for (key in keys) this[key] = this[key]!! + 5; this } -> Option B
Quick Check:
Update map values by keys inside with = B [OK]
Hint: Use keys to update mutable map values inside with [OK]
Common Mistakes:
Trying to modify keys instead of values
Assuming mapValues mutates original map
Modifying map entries directly in forEach causes error
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.