We break down how Kotlin on the JVM “plays nicely” with Java APIs that accept functional interfaces (SAM types,
Single Abstract Method): how a lambda is automatically turned into a
Runnable,
Predicate, or
Comparator, how trailing-lambda syntax works, why ambiguous overloads sometimes happen, and which practical mistakes occur most often (overflow in a comparator, confusion between
Predicate<T> vs
(T) -> Boolean, capturing an outer
var).