Bird
Raised Fist0
Kotlinprogramming~10 mins

SAM conversions for Java interfaces in Kotlin - Step-by-Step Execution

Choose your learning style10 modes available
Concept Flow - SAM conversions for Java interfaces
Java Interface with Single Abstract Method
↓
Kotlin Lambda Expression
↓
SAM Conversion Applied
↓
Instance of Java Interface Created
↓
Interface Method Called
Kotlin converts a lambda into an instance of a Java interface with one abstract method (SAM) automatically when needed.
Execution Sample
Kotlin
val runnable = Runnable { println("Running") }
runnable.run()
Creates a Runnable using a lambda via SAM conversion and calls its run method.
Execution Table
StepActionEvaluationResult
1Define lambda for RunnableRunnable { println("Running") }Lambda stored as SAM instance
2Assign lambda to 'runnable'val runnable = Runnable { ... }runnable holds SAM instance
3Call runnable.run()runnable.run()Prints: Running
4End of execution--
💡 Program ends after runnable.run() prints output
Variable Tracker
VariableStartAfter 1After 2Final
runnablenullSAM instance wrapping lambdaSAM instance wrapping lambdaSAM instance wrapping lambda
Key Moments - 2 Insights
Why can we assign a lambda to a Java interface variable?
Because Kotlin automatically converts the lambda to an instance of the Java interface with a single abstract method, as shown in execution_table step 2.
What happens when runnable.run() is called?
The lambda code inside the SAM instance runs, printing 'Running' as shown in execution_table step 3.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution table, what is stored in 'runnable' after step 2?
ANull
BA plain function
CA lambda expression as a SAM instance
DAn integer value
💡 Hint
Check execution_table row 2 under 'Result' column
At which step does the program print 'Running'?
AStep 2
BStep 3
CStep 1
DStep 4
💡 Hint
Look at execution_table row 3 under 'Result' column
If the Java interface had two abstract methods, what would happen to the SAM conversion?
AKotlin would not apply SAM conversion automatically
BThe lambda would convert to a different interface
CIt would still work the same
DThe program would print an error at runtime
💡 Hint
SAM conversion applies only to interfaces with a single abstract method
Concept Snapshot
SAM conversions let Kotlin lambdas become Java interface instances
Only works if interface has exactly one abstract method
Syntax: val x = JavaInterface { lambda code }
Calling interface method runs the lambda
Simplifies using Java functional interfaces in Kotlin
Full Transcript
This visual trace shows how Kotlin converts a lambda expression into an instance of a Java interface with a single abstract method (SAM). First, a lambda is defined for the Runnable interface. Then Kotlin automatically wraps this lambda into a SAM instance and assigns it to the variable 'runnable'. When runnable.run() is called, the lambda code executes and prints 'Running'. This automatic conversion only works if the Java interface has exactly one abstract method. The variable tracker shows 'runnable' holds the SAM instance after assignment. The key moments clarify why the lambda can be assigned to the interface and what happens when the method is called. The quiz questions test understanding of these steps and the SAM conversion rule.

Practice

(1/5)
1.

What does SAM conversion allow you to do in Kotlin when working with Java interfaces?

easy
A. Automatically convert Kotlin functions to Java classes
B. Convert Java interfaces to Kotlin data classes
C. Use multiple methods in a Java interface as lambdas
D. Use a lambda expression instead of an anonymous class for interfaces with one method

Solution

  1. Step 1: Understand SAM conversion purpose

    SAM conversion lets Kotlin treat Java interfaces with a single abstract method as functional interfaces.
  2. Step 2: Identify how it simplifies code

    This allows using lambda expressions instead of verbose anonymous classes for such interfaces.
  3. Final Answer:

    Use a lambda expression instead of an anonymous class for interfaces with one method -> Option D
  4. Quick Check:

    SAM conversion = Lambda for single-method Java interfaces [OK]
Hint: Remember: SAM = Single Abstract Method = one lambda [OK]
Common Mistakes:
  • Thinking SAM works for interfaces with multiple methods
  • Confusing SAM conversion with Kotlin function to Java class conversion
  • Assuming SAM converts Java interfaces to Kotlin classes
2.

Which of the following is the correct Kotlin syntax to use SAM conversion with the Java Runnable interface?

val r = ???
easy
A. Runnable { println("Running") }
B. Runnable.run { println("Running") }
C. Runnable.run() -> println("Running")
D. Runnable.run { -> println("Running") }

Solution

  1. Step 1: Recall SAM conversion syntax for Runnable

    Runnable is a Java interface with one method run(), so Kotlin allows lambda syntax: Runnable { ... }
  2. Step 2: Check each option's syntax

    Runnable { println("Running") } correctly uses Runnable { println("Running") }. Others misuse method calls or lambda syntax.
  3. Final Answer:

    Runnable { println("Running") } -> Option A
  4. Quick Check:

    Runnable lambda = Runnable { ... } [OK]
Hint: Use Runnable { } directly for SAM conversion [OK]
Common Mistakes:
  • Trying to call run() method explicitly in lambda
  • Using arrow syntax incorrectly inside Runnable
  • Confusing method reference with lambda syntax
3.

What will be the output of this Kotlin code using SAM conversion with Comparator?

val list = listOf("apple", "banana", "cherry")
val sorted = list.sortedWith(Comparator { a, b -> b.length - a.length })
println(sorted)
medium
A. ["cherry", "banana", "apple"]
B. ["apple", "banana", "cherry"]
C. ["banana", "apple", "cherry"]
D. ["banana", "cherry", "apple"]

Solution

  1. Step 1: Understand the Comparator lambda

    The lambda compares strings by length descending: b.length - a.length.
  2. Step 2: Sort the list by string length descending

    "banana" (6), "apple" (5), "cherry" (6). Since "banana" and "cherry" have same length, their order depends on original order.
  3. Step 3: Determine sorted order

    Between "banana" and "cherry", "banana" comes first in original list, so it stays first. Then "cherry", then "apple" last.
  4. Final Answer:

    ["banana", "apple", "cherry"] -> Option C
  5. Quick Check:

    Sorted by length descending = [banana, apple, cherry] [OK]
Hint: Comparator lambda: b.length - a.length sorts descending [OK]
Common Mistakes:
  • Assuming ascending order instead of descending
  • Mixing up a and b in comparator lambda
  • Ignoring stable sort behavior for equal lengths
4.

Identify the error in this Kotlin code using SAM conversion with a Java interface ActionListener:

val listener = ActionListener { event ->
    println("Clicked")
}
button.addActionListener(listener)
medium
A. SAM conversion works only if the interface is a Java interface with one method
B. The lambda parameter name must be e, not event
C. ActionListener is a Kotlin interface, so SAM conversion does not apply
D. You must use an anonymous object instead of a lambda

Solution

  1. Step 1: Check if ActionListener is a Java interface with one method

    ActionListener is a Java interface with a single method actionPerformed(ActionEvent).
  2. Step 2: Verify SAM conversion applicability

    SAM conversion applies only to Java interfaces with exactly one abstract method, so it should work here.
  3. Step 3: Identify the actual error

    If the code does not compile, it might be because the Kotlin compiler does not recognize ActionListener as a SAM interface due to missing Java interop or import.
  4. Final Answer:

    SAM conversion works only if the interface is a Java interface with one method -> Option A
  5. Quick Check:

    SAM conversion requires Java single-method interface [OK]
Hint: SAM only works with Java interfaces having one abstract method [OK]
Common Mistakes:
  • Assuming Kotlin interfaces support SAM conversion
  • Thinking parameter name must be fixed
  • Believing anonymous objects are always required
5.

You want to use SAM conversion to simplify this Java interface usage in Kotlin:

public interface Task {
    void execute(int times);
}

Which Kotlin lambda expression correctly uses SAM conversion for Task?

hard
A. Task { println("Executed times") }
B. Task { times -> println("Executed $times times") }
C. Task.execute { times -> println("Executed $times times") }
D. Task.run { times -> println("Executed $times times") }

Solution

  1. Step 1: Confirm Task is a Java interface with one method

    Task has one method execute(int times), so SAM conversion applies.
  2. Step 2: Write correct lambda syntax for SAM conversion

    The lambda must accept one parameter (times) matching the method signature: Task { times -> ... }
  3. Step 3: Check each option

    Task { times -> println("Executed $times times") } correctly uses Task { times -> println(...) }. Others misuse method calls or omit parameter.
  4. Final Answer:

    Task { times -> println("Executed $times times") } -> Option B
  5. Quick Check:

    SAM lambda matches method parameters = Task { times -> println("Executed $times times") } [OK]
Hint: Match lambda parameters to single method parameters exactly [OK]
Common Mistakes:
  • Calling method name explicitly in lambda
  • Omitting lambda parameter when method requires one
  • Using wrong method name in lambda expression
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard