Kotlin for Developers

Essentials

This book covers the essentials of Kotlin so you can start developing with this amazing programming language. It shows nearly everything you need to know in clear and executable code examples.

Introduction

Kotlin is a powerful language, largely thanks to its expressive syntax, intuitive and null-safe type system, and great tooling support. It’s no wonder that Kotlin is the most popular language for Android development and is a popular replacement for Java on backend applications. It is also used for data science and for multiplatform, iOS, desktop, and web application development.

Who this book is for

This book is for developers with experience in other programming languages. Specifically, experience with an object-oriented programming language (such as Java, JavaScript, Python, or C++) would be beneficial to the reader.

What is covered

This book focuses on the essential Kotlin features, including:

  • variables, values, and types,
  • conditional statements and loops,
  • support for nullability,
  • classes, interfaces, and inheritance,
  • object expressions and declarations,
  • data, sealed, enum, and annotation classes,
  • extension functions,
  • collections,
  • operator overloading,
  • the type system,
  • generics.
Marcin Moskała

Marcin Moskała

Marcin Moskala is a highly experienced developer and Kotlin instructor as the founder of Kt. Academy, an official JetBrains partner specializing in Kotlin training, Google Developers Expert, known for his significant contributions to the Kotlin community. Moskala is the author of several widely recognized books, including "Effective Kotlin," "Kotlin Coroutines," "Functional Kotlin," "Advanced Kotlin," "Kotlin Essentials," and "Android Development with Kotlin."

Beyond his literary achievements, Moskala is the author of the largest Medium publication dedicated to Kotlin. As a respected speaker, he has been invited to share his insights at numerous programming conferences, including events such as Droidcon and the prestigious Kotlin Conf, the premier conference dedicated to the Kotlin programming language.

Chapters available as articles

Jetpack Compose Modifier Guessing Game!

A fun game to learn about Jetpack Compose modifiers.

Is reflection slowing down your code?

Let's benchmark reflection and see how it affects the performance of your code.

Using BlockHound to track blocking calls in non-blocking dispatchers

How to use BlockHound to track blocking calls in non-blocking dispatchers.

Representing ViewModel events with StateFlow vs. SharedFlow vs. Channel

What is the best way to represent ViewModel events in Kotlin?

The best dispatcher for a backend framework

Let's explore different dispatchers and find the best one for a backend request handlers.

KotlinConf 2024 - what is this all about?

Exploring the Biggest Kotlin Conference

Win a Free Ticket to Droidcon Italy!

Upgrade your Kotlin skills and win a free ticket to Droidcon Italy!

The problem of union types for type systems

Why union types are not such a good idea for static type systems.

Key advantages of Kotlin Coroutines

Where Kotlin Coroutines shine and why you should use them.

Finance your workshop by company

How to get your workshop financed by your company.

Which Kotlin workshop to choose?

A short guide how to choose the best workshop for you.

Power Assert now in Kotlin!

What is Power Assert, how to use it, and how it works in Kotlin.

Why Non-Blocking?

From blocking to non-blocking with Kotlin, Coroutines and Spring Boot

A Pattern for Composing Flow Operations

Extending and operating on top of your existing flows

flatMapMerge is... weird

How not to get surprised by flatMapMerge behavior.

How many threads your network client uses?

Many popular network clients consume way more threads than you might expect. Let's overview the problem and find a solution.

Mutable objects or properties?

Time to answer the question: var/readonly vs val/mutable. Which one should you use?

SharedFlow vs StateFlow

When to use SharedFlow and when to use StateFlow.

Updates in Kotlin for Developers series

Noticed any changes in our Kotlin for Developers series? Here's what's new!

Big Kotlin Challenge

Do you want to learn Kotlin? Join our Big Kotlin Challenge!

Books for 2023 company workshops attendees promotion

Our special promotion for company workshops organised in 2023.

Books for 2024 company workshops attendees promotion

Our special promotion for company workshops organised in 2024.

Books for 2025 company workshops attendees promotion

Our special promotion for company workshops organised in 2025.

Eliminating coroutine races

How to make one coroutine await for another coroutine or flow subscription.

Running Kotlin coroutines on Project Loom's virtual threads

How to use Project Loom to improve Coroutines performance.

Slowing down your code with Coroutines

How can we use coroutines to slow down our code, and why would we want to do that.

Essential programming nomenclature

Find out what you need to know, before you start writing documentations, books or articles about programming.

Type modelling in Kotlin

Type safety is undervalued in most software projects and causes enormous financial losses throughout the world. Changing a few bad habits can lead to more reliable software.

Object-oriented or functional? Two ways to see the world

The difference between the OOP and FP paradigms is deeply rooted in how we see the world. A few words on the philosophy of both approaches.

How to write a technical book?

A guide for writing technical books.

Software Testing Standards (Aligned with ISTQB)

Aligning our testing activities with ISTQB standards helps us to perform efficiently and cope with project scope and deadlines. In this workshop we will go over software testing stages starting from definition to maintenance.

Leveraging AI in Software Testing

As AI is confronting us in our daily lives and it is improving the development activities by eliminating some manual efforts, it is beneficial to embrace in our tasks. We will see how we can utilize AI based algorithms in Software Testing.

Best Principles for Successful Test Automation (API and UI)

Aligning our testing activities with ISTQB standards helps us to perform efficiently and cope with project scope and deadlines. In this workshop we will go over software testing stages starting from definition to maintenance.

Funny programming videos

A collection of funny videos for programmers.

Funny programming comics

A collection of funny comics for programmers.

Why is Kotlin your next Programming Language?

What is Kotlin, and why it should be your next programming language.

Code or No-code?

What are the strong sides of code and no-code, and why do they constantly fight with each other.

Simulating dice casting, to calculate Risc game fairness

Using programming to simulate a battle in Risc, and learn about its fairness.

Lindy effect in surnames problem

Using programming to simulate a problem of the number of surnames in population and observing Lindy effect.

Advent of Kotlin: Week 1: JSON stringify and possible value parentheses

Week 1 of the Advent of Kotlin: JSON stringify and possible well-formed parentheses

Advent of Kotlin: Week 2

Week 2 of the Advent of Kotlin: Tree algorithms

Advent of Kotlin: Week 3

Week 3 of the Advent of Kotlin: k-means clustering

Advent of Kotlin: Week 4

Week 4 of the Advent of Kotlin: Parsing JSON

Advent of Kotlin Solutions

Solutions to the Advent of Kotlin!

Variables point to objects

A basic feature, that is commonly misunderstood.

Traits for testing in Kotlin

A trick needed when using traits for testing in Kotlin.

Kt. Academy new logo: Phoenix

Why we decided to change our logo, and what is the symbolism of Phoenix.

Kotlin bites on Twitter 1

A collection of Kotlin bites of knowledge, in a form of tweets.

Kotlin bites on Twitter 2

A collection of Kotlin bites of knowledge, in a form of tweets.

Kotlin bites on X/Twitter 3

A collection of Kotlin bites of knowledge, in a form of tweets.

Kotlin revolutionary announcement

Kotlin announcement that will change the way we all will write code.

Why you should consider migrating your Gradle scripts to Kotlin DSL

Discover the benefits of migrating your Gradle scripts to Kotlin DSL and streamline your development process.

Kotlin Coroutines: Deep Dive book is finally ready!

Learn about our recently published book dedicated to Kotlin Coroutines.

The second edition of Kotlin Coroutines: Deep Dive book is finally ready!

Learn about the new release of the famous book about Kotlin Coroutines.

The third edition of Kotlin Coroutines: Deep Dive book is finally ready!

Learn about the new release of the famous book about Kotlin Coroutines.

Functional Kotlin book is finally ready!

Learn about our recently published book dedicated to functional Kotlin features.

Kotlin Essentials book is finally ready!

Learn about our recently published book dedicated to the essential Kotlin features.

Advanced Kotlin is finally ready!

Learn about our recently published book dedicated to the advanced Kotlin features.

The second edition of Effective Kotlin: Best Practices is finally ready!

Learn about the new release of the famous book about the best practices for Kotlin development.

Kotlin for Developers series is updated to Kotlin 1.9 and ready for 2.0

All the books from the series Kotlin for Developers are ready for Kotlin 2.0!

Kotlin Essentials now with exercises

Kotlin Essentials was updated! Now it has exercises to help readers practice the knowledge.

The story behind the lighthouse

The story behind the lighthouse used on the new edition of Effective Kotlin.

Learn Kotlin with Marcin Moskała

See what materials and options from Marcin Moskala you can have to learn Kotlin.

Functional Kotlin now with exercises

Functional Kotlin was updated! Now it has exercises to help readers practice the knowledge.

Kotlin for developers' series is finally ready!

We are happy to announce that Kotlin for developers series is finally complete.

Kotlin books for conferences and universities

We have a very special offers for conferences and universities that want to give away books.

Get an ebook if you have a paperback!

Special promotion until the end of this year, we give away ebooks for paperback owners who post their photos with those books.

Kotlin Coroutines Recipes

Let's see some recipes useful in Kotlin Coroutines projects.

Kotlin Generic Variance Modifiers

What are out and in, and how do we use them without even knowing.

Covariant Nothing Object

The pattern we are all using, but no-one talks about it.

Variance modifiers limitations

What limitations generic variance modifiers introduce, and how can we ignore them.

Interface Delegation

One of the least known Kotlin features, that can be sometimes found really useful.

Property delegation

What is property delegation, how does it work, and how can we implement our custom property delegate.

Lazy property delegate

What is lazy delegate, and what are its real-life use cases.

Observable and Vetoable delegates

What are observable and vetoable delegates, and what are their real-life use cases.

Map as a property delegate

How do we use Map as a property delegate, and why the result of a famous puzzler should not be surprising.

Kotlin Contracts

Practical review of Kotlin Contracts - a feature we often use, without knowing about it.

Kotlin and Java interoperability: Types

See surprising transitions that happens on types when you interoperate between Kotlin and Java.

Kotlin and Java interoperability: Properties and annotations

Kotlin property is Java getter, setter, field and possibly more. So what to do, when you need to annotate or use a specific JVM element?

Kotlin and Java interoperability: Useful annotations

Learn about useful Kotlin annotations, that decide that it is compiled to on JVM.

Kotlin and Java interoperability: Traps and gotchas

The parts of Kotlin and Java interoperability that might be surprising or counterintuitive.

Using Multiplatform Kotlin

The essence of using multiplatform Kotlin capabilities and definition common elements.

Implementing Multiplatform Kotlin library

How in Kotlin we can use multiplatform capabilities to distribute the same code to multiple platforms.

Implementing Multiplatform Kotlin Mobile

How in Kotlin we can implement Android and iOS projects with shared logic.

JavaScript interoperability

How to interoperate between Kotlin and JavaScript.

Kotlin Reflection: Method and property references

The general hierarchy of Kotlin reference classes, and details about method and property references.

Kotlin Reflection: Class references

All the essential aspects of class references, and a practical object serialization example.

Kotlin Reflection: Type references

Using type references, with practical example of random value generator.

Annotation Processing

Implement your first annotation processor in Kotlin.

Kotlin Symbol Processing

All the essential aspects of KSP in practice.

Kotlin Compiler Plugins

All you need to know about Kotlin Compiler plugins.

Static Code Analysers

All you need to know about Static Code Analysers and Detekt.

Why using Kotlin Coroutines?

The explanation of why coroutines stand out and offer us what hasn't been offered by other technologies.

How does suspension work in Kotlin coroutines?

A deep explanation of how suspension works in Kotlin Coroutines.

Coroutines under the hood

A deep dive into how suspension and continuations work under the hood.

What is CoroutineContext and how does it work?

A deep explanation of the coroutine context - the powerful data holder for coroutines.

Kotlin Coroutines dispatchers

Where we should use each dispatcher from the Kotlin Coroutines library.

Job and children awaiting in Kotlin Coroutines

What Job is and how it is the most important context responsible for structured concurrency.

Cancellation in Kotlin Coroutines

Everything you need to know about the cancellation mechanism in Kotlin Coroutines.

Constructing a coroutine scope

How we generally define coroutine scope on Android and on the backend.

Testing Kotlin Coroutines

How we test Kotlin Coroutines, including common Android and backend cases.

Understanding Flow

We will explore how flow and its processing really works.

SharedFlow and StateFlow

Known as a replacement for Subject, LiveData, and many more. SharedFlow and StateFlow are powerful coroutines classes, every Kotlin developer should know.

Kotlin Coroutines use cases introduction

Introducing a series of articles about common Kotlin Coroutines use cases.

Kotlin Coroutines use cases for Data/Adapters Layer

How do we use Kotlin Coroutines in the Data/Adapters Layer, how do we use callback or blocking functions.

Kotlin Coroutines use cases for Domain Layer

How do we use Kotlin Coroutines in the Domain Layer.

Kotlin Coroutines use cases for Presentation/API/UI Layer

How do we use Kotlin Coroutines in the Presentation/API/UI Layer Layer, how do we create scope and start coroutines.

Best practices

Let's review the Kotlin Coroutines best practices.

Effective Kotlin Item 1: Limit mutability

Why it is so important to limit mutability, and how Kotlin supports it.

Effective Kotlin Item 2: Eliminate critical sections

Learn why do we need to synchronize access to mutable state, and how to secure it.

Effective Kotlin Item 5: Specify your expectations for arguments and state

How do we specify requirements and expectations in Kotlin.

Effective Kotlin Item 7: Prefer a nullable or Result result type when the lack of a result is possible

Why should we prefer to avoid throwing exceptions and using types to our advantage.

Effective Kotlin Item 10: Design for readability

Do we really want out applications concise, or do we rather want them readable?

Effective Kotlin Item 19: Do not repeat knowledge

Why knowledge repetition is so problematic and how it relates to the single responsibility principle.

Effective Kotlin Item 20: Do not repeat common algorithms

Why extracting utility functions is so important for our programs.

Abstraction design: Introduction

What is abstraction in programming and why is it so important.

Item 25: Each function should be written in terms of a single level of abstraction

Why each function should be written in terms of a single level of abstraction and how to achieve it.

Item 26: Use abstraction to protect code against changes

How do we abstract elements, and what are the consequences.

Item 27: Specify API stability

How do we specify API stability and why it is so important.

Item 28: Consider wrapping external APIs

Why we should wrap external APIs and how to do it.

Item 29: Minimize elements’ visibility

Why we should minimize elements’ visibility and how to do it.

Item 30: Define contracts with documentation

How do we express our library or module contracts and why are they so important.

Item 31: Respect abstraction contracts

Just because we can do something, does not mean we should. How to respect abstraction contracts and why it is so important.

Effective Kotlin Item 32: Consider factory functions instead of secondary constructors

What factory functions are and why they are so important patterns for object creation.

Effective Kotlin Item 35: Consider using dependency injection

What is dependency injection, why it is so important, and how to use it in Kotlin.

Effective Kotlin Item 36: Prefer composition over inheritance

Years of OOP made us overuse inheritance. Instead, we should more often use a composition that is safer and more explicit. More often, but not always...

Effective Kotlin Item 46: Avoid member extensions

What member extensions are, how they are possible and why we should avoid using them.

Effective Kotlin Item 47: Avoid unnecessary object creation

About the most essential rule of performance optimization.

Effective Kotlin Item 48: Consider using object declarations

Why we should use object declarations instead of regular classes.

Effective Kotlin Item 49: Use caching when possible

Why we should use caching and how to do it.

Effective Kotlin Item 51: Use the inline modifier for functions with parameters of functional types

How inline functions work and why they can be so important for the performance of our application.

Effective Kotlin Item 52: Consider using inline value classes

What value classes are, how to use and inline them.

Effective Kotlin Item 53: Eliminate obsolete object references

How to help our garbage collector and avoid memory leaks.

Effective Kotlin Item 54: Prefer Sequences for big collections with more than one processing step

What the difference between list and sequence processing is, and when each should be preferred.

Effective Kotlin Item 55: Consider associating elements to a map

How associateBy is useful to improve the performance of finding elements.

Effective Kotlin Item 56: Consider using groupingBy instead of groupBy

What Grouping is, and how groupingBy instead of groupBy can be a performance optimization.

Effective Kotlin Item 60: Use appropriate collection types

Using non-standard collection types to improve performance in Kotlin.

Lambda expressions

Let's learn how to use lambda expressions, what special support they have, and what traps they generate.

Function references

How do we reference functions in Kotlin, to replace lambda expressions. All functions, including constructors, getters, extensions and more.

DSL type-safe builders

How to define type-safe DSL builders in Kotlin.

Scope functions

What is let, also, apply and with, and how to use them in our applications.

Context receivers

All you need to know about the new and powerful Kotlin feature: context receivers.

A birds-eye view of Arrow: working with function with Arrow Core

Learn about essential Arrow functions used for composition, memoization, recursion and functions generation.

A birds-eye view of Arrow: Error Handling

Learn about Error Handling in Arrow, end how to effectively work with Either.

A birds-eye view of Arrow: Data Immutability with Arrow Optics

Learn to use Arrow Optics to support working on immutable objects.

Your first program in Kotlin

How to write your first program, how can we use it in real-life projects, and how to explore what Kotlin is compiled to.

Basic values in Kotlin

Learn about the basic Kotlin values, types and operations.

Functions in Kotlin

Learn about what functions can offer us in Kotlin.

The power of Kotlin for-loop

Learn about the amazing capabilities of Kotlin for-loop.

Nullability in Kotlin

How Kotlin null-safety works, and how can we deal with nullable values.

Data classes in Kotlin

What are data classes in Kotlin and how do we use them.

Objects in Kotlin

What is object expression, object declaration and companion objects, and how we use them.

Enum classes in Kotlin

What are enum classes in Kotlin and how do we use them.

Sealed classes and interfaces in Kotlin

What are sealed classes and interfaces in Kotlin and how do we use them.

Extensions in Kotlin

What are extensions in Kotlin and how do we use them.

Operator overloading in Kotlin

How are operators defined for types in Kotlin, and how can we define our own operators.

The beauty of Kotlin type system

How type system makes Kotlin so flexible, safe, and intuitive.

Generics in Kotlin

The essence of how generics work in Kotlin.

Persistent memory - Introduction

Do you want to learn about persistent memory? Join this journey to explore persistent memory and build a persistent dictionary.

In-memory dictionary

Let's begin our journey to understand persistent memory by building an in-memory dictionary.

Introducing persistent memory

Let's learn the basics of persistent memory, its characteristics, how it works and the beauty of byte addressability.

Persistent dictionary

Let's make our in-memory dictionary persistent and understand some concepts of PMDK.

Persistent memory design choices and use-cases

Let's understand some design choices with persistent memory and use-cases of persistent memory.