Table of contents : Table of Contents Introduction For whom is this book written? What will be covered? The Kotlin for Developers series My story Conventions Code conventions Acknowledgments What is Kotlin? Kotlin platforms The Kotlin IDE Where do we use Kotlin? Your first program in Kotlin Live templates What is under the hood on JVM? Summary Variables Basic types, their literals and operations Numbers Booleans Characters Strings Summary Conditional statements: if, when, try, and while if-statement when-statement when-statement with a value is check Explicit casting Smart-casting While and do-while statements Summary Functions Single-expression functions Functions on all levels Parameters and arguments Unit return type Vararg parameters Named parameter syntax and default arguments Function overloading Infix syntax Function formatting Summary The power of the for-loop Ranges Break and continue Use cases Summary Nullability Safe calls Not-null assertion Smart-casting The Elvis operator Extensions on nullable types null is our friend lateinit Summary Classes Member functions Properties Constructors Classes representing data in Kotlin and Java Inner classes Summary Inheritance Overriding elements Parents with non-empty constructors Super call Abstract class Interfaces Visibility Any Summary Data classes Transforming to a string Objects equality Hash code Copying objects Destructuring When and how should we use destructuring? Data class limitations Prefer data classes instead of tuples Summary Objects Object expressions Object declaration Companion objects Data object declarations Constant values Summary Exceptions Throwing exceptions Defining exceptions Catching exceptions A try-catch block used as an expression The finally block Important exceptions The hierarchy of exceptions Summary Enum classes Data in enum values Enum classes with custom methods Summary Sealed classes and interfaces Sealed classes and when expressions Sealed vs enum Use cases Summary Annotation classes Meta-annotations Annotating the primary constructor List literals Summary Extensions Extension functions under the hood Extension properties Extensions vs members Extension functions on object declarations Member extension functions Use cases Summary Collections The hierarchy of interfaces Mutable vs read-only types Creating collections Lists Sets Maps Using arrays in practice Summary Operator overloading An example of operator overloading Arithmetic operators The rangeUntil operator The in operator The iterator operator The equality and inequality operators Comparison operators The indexed access operator Augmented assignments Unary prefix operators Increment and decrement The invoke operator Precedence Summary The beauty of Kotlin’s type system What is a type? Why do we have types? The relation between classes and types Class vs type in practice The relationship between types The subtype of all the types: Nothing The result type from return and throw When is some code not reachable? The type of null Summary Generics Generic functions Generic classes Generic classes and nullability Generic interfaces Type parameters and inheritance Type erasure Generic constraints Star projection Summary Final words