Title Page Copyright and Credits Functional Kotlin Dedication Packt Upsell Why subscribe? PacktPub.com Contributors About the authors About the reviewer Packt is searching for authors like you Preface Who this book is for What this book covers To get the most out of this book Download the example code files Download the color images Conventions used Get in touch Reviews Kotlin – Data Types, Objects, and Classes Classes Properties Methods Inheritance Abstract classes Interfaces Objects Object declarations Companion objects Generics Type alias Nullable types Checking for null Checking for non-null types Safe calls The Elvis (?:) operator The (!!) operator Kotlin's type system The Any type Minimum common types The Unit type The Nothing type Other types Data classes Canonical methods The copy() method Destructuring methods Annotations Enum Summary Getting Started with Functional Programming What is functional programming? Basics concepts First-class and higher-order functions Pure functions Recursive functions Lazy evaluation Functional collections Implementing a functional list Summary Immutability - It's Important What is immutability? Implementing immutability in Kotlin The difference between var and val Compile time constants Types of immutability Immutable reference  (referential immutability) Immutable values Immutable collections The advantages of immutability Thread safety Low coupling Referential transparency Failure atomicity Caching Compiler optimization Pure functions The disadvantages of immutability Summary Functions, Function Types, and Side Effects Functions in Kotlin Returning two values from a function Extension functions Default arguments Nested functions Function types in functional programming Lambda Function as property High order functions Pure functions and side effects Side effects Pure functions Summary More on Functions Single-expression functions Parameters vararg Lambda Named parameters Named parameters on high-order functions Default parameters Extension functions Extension functions and inheritance Extension functions as members Extension functions with conflicting names Extension functions for objects Infix functions Operator overloading Binary operators Invoke Indexed access Unary operators Type-safe builders Creating a DSL Inline functions Inline restrictions Recursion and corecursion Summary Delegates in Kotlin Introduction to delegation Understanding delegation Delegates in Kotlin Property delegation (standard delegates) The Delegates.notNull function and lateinit The lazy function Observing property value change with Delegates.Observable The power of veto – Delegates.vetoable Delegated map Custom delegation Local delegates Class delegation Summary Asynchronous Programming with Coroutines Introduction to coroutines Understanding JVM threads Hello, coroutine world! Using coroutines in real life Synchronous implementation Callbacks Java Futures Promises with Kovenant  Coroutines Coroutine context Channels Channel pipelines Managing mutable state Switching contexts Thread safe structures Mutexes Actors Summary Collections and Data Operations in Kotlin An introduction to collections The advantages of a collections framework List and MutableList Set and MutableSet Map and MutableMap Data operations in a collection The map function The filter function The flatMap function The drop functions The take functions The zip function Grouping collections Summary Functional Programming and Reactive Programming Combining FP with OOP Functional reactive programming The Reactive Manifesto Functional reactive frameworks for Kotlin Getting started with RxKotlin Downloading and setting up RxKotlin Comparing the Pull mechanism with the RxJava Push mechanism Observables How Observable works The Observable.create method The Observable.from methods Iterator<T>.toObservable Subscriber – the Observer interface Subscribing and disposing Summary Functors, Applicatives, and Monads Functors    Monads Applicatives Summary Working with Streams in Kotlin Introduction to Streams Collections versus Streams Working with Streams Primitive streams Stream factory methods Stream Builder Creating empty Streams – Stream.empty() Creating a Stream by passing elements – Stream.of() Generating Streams – Stream.generate() Collector and Stream.collect – collecting Streams The Collectors.toList(), Collectors.toSet(), and Collectors.toCollection() methods Collecting into Map – Collectors.toMap() Joining Stream of strings – Collectors.joining() Grouping elements of Stream – Collectors.groupingBy() Summary Getting Started with Arrow Function composition Partial application Binding Reverse Pipes Currying Differences between the currying and partial application Logical complement Memoization Partial functions Identity and constant Optics Configuring Arrows code generation Generating lenses Summary Arrow Types Option Arrow's type hierarchy Either Monad transformers Try State Corecursion with State Summary Kotlin's Quick Start Writing and running Kotlin Kotlin online On your console Installing SDKMAN Installing Kotlin through SDKMAN Kotlin's REPL Compiling and executing Kotlin files Using Gradle Install Gradle through SDKMAN Creating a distributable Gradle command Creating a Gradle project file Creating our Hello World code Using IntelliJ IDEA or Android Studio Importing Gradle files with IntelliJ IDEA Basic Kotlin syntax General features Packages String concatenation and interpolation Comments  Control structures if expression when expression for loop while and do loops Going further Other Books You May Enjoy Leave a review - let other readers know what you think