SlideShare ist ein Scribd-Unternehmen logo
1 von 75
Downloaden Sie, um offline zu lesen
The Kotlin
               Programming Language

                             Andrey Breslav




Monday, September 19, 2011
What is Kotlin?




                             2
Monday, September 19, 2011
What is Kotlin?
                   •         Statically typed




                                                2
Monday, September 19, 2011
What is Kotlin?
                   •         Statically typed
                   •         object-oriented




                                                2
Monday, September 19, 2011
What is Kotlin?
                   •         Statically typed
                   •         object-oriented
                   •         JVM-targeted




                                                2
Monday, September 19, 2011
What is Kotlin?
                   •         Statically typed
                   •         object-oriented
                   •         JVM-targeted
                   •         general-purpose




                                                2
Monday, September 19, 2011
What is Kotlin?
                   •         Statically typed
                   •         object-oriented
                   •         JVM-targeted
                   •         general-purpose
                   •         programming language




                                                    2
Monday, September 19, 2011
What is Kotlin?
                   •         Statically typed
                   •         object-oriented
                   •         JVM-targeted
                   •         general-purpose
                   •         programming language
                   •         developed by JetBrains




                                                      2
Monday, September 19, 2011
What is Kotlin?
                   •         Statically typed
                   •         object-oriented
                   •         JVM-targeted
                   •         general-purpose
                   •         programming language
                   •         developed by JetBrains
                         ➡      intended for industrial use




                                                              2
Monday, September 19, 2011
What is Kotlin?
                   •         Statically typed
                   •         object-oriented
                   •         JVM-targeted
                   •         general-purpose
                   •         programming language
                   •         developed by JetBrains
                         ➡      intended for industrial use



                   •         Docs available today



                                                              2
Monday, September 19, 2011
What is Kotlin?
                   •         Statically typed
                   •         object-oriented
                   •         JVM-targeted
                   •         general-purpose
                   •         programming language
                   •         developed by JetBrains
                         ➡      intended for industrial use



                   •         Docs available today
                   •         Public beta is planned for the end of 2011

                                                              2
Monday, September 19, 2011
Goal-wise...




                              3
Monday, September 19, 2011
Goal-wise...
                   • Number of research papers we are
                             planning to publish on Kotlin is




                                               3
Monday, September 19, 2011
Goal-wise...
                   • Number of research papers we are
                             planning to publish on Kotlin is
                         ➡    Zero




                                               3
Monday, September 19, 2011
Goal-wise...
                   • Number of research papers we are
                             planning to publish on Kotlin is
                         ➡    Zero
                         ➡    ... or really close to that




                                                   3
Monday, September 19, 2011
Outline
                   • Motivation
                   • Feature overview
                   • Basic syntax
                   • Classes and Types
                   • Higher-order functions
                   • Type-safe Groovy-style Builders
                                      4
Monday, September 19, 2011
Motivation




                             5
Monday, September 19, 2011
Motivation
                   •         Why a new language?




                                                   5
Monday, September 19, 2011
Motivation
                   •         Why a new language?
                         ➡     We are not satisfied with the existing ones
                         ➡     And we have had a close look at many of them over 10 years




                                                      5
Monday, September 19, 2011
Motivation
                   •         Why a new language?
                         ➡     We are not satisfied with the existing ones
                         ➡     And we have had a close look at many of them over 10 years

                   •         Design goals




                                                      5
Monday, September 19, 2011
Motivation
                   •         Why a new language?
                         ➡     We are not satisfied with the existing ones
                         ➡     And we have had a close look at many of them over 10 years

                   •         Design goals
                         ➡     Full Java interoperability




                                                      5
Monday, September 19, 2011
Motivation
                   •         Why a new language?
                         ➡     We are not satisfied with the existing ones
                         ➡     And we have had a close look at many of them over 10 years

                   •         Design goals
                         ➡     Full Java interoperability
                         ➡     Compiles as fast as Java




                                                      5
Monday, September 19, 2011
Motivation
                   •         Why a new language?
                         ➡     We are not satisfied with the existing ones
                         ➡     And we have had a close look at many of them over 10 years

                   •         Design goals
                         ➡     Full Java interoperability
                         ➡     Compiles as fast as Java
                         ➡     Safer than Java




                                                      5
Monday, September 19, 2011
Motivation
                   •         Why a new language?
                         ➡     We are not satisfied with the existing ones
                         ➡     And we have had a close look at many of them over 10 years

                   •         Design goals
                         ➡     Full Java interoperability
                         ➡     Compiles as fast as Java
                         ➡     Safer than Java
                         ➡     More concise than Java


                                                      5
Monday, September 19, 2011
Motivation
                   •         Why a new language?
                         ➡     We are not satisfied with the existing ones
                         ➡     And we have had a close look at many of them over 10 years

                   •         Design goals
                         ➡     Full Java interoperability
                         ➡     Compiles as fast as Java
                         ➡     Safer than Java
                         ➡     More concise than Java
                         ➡     Way simpler than Scala
                                                      5
Monday, September 19, 2011
Feature overview




                             6
Monday, September 19, 2011
Feature overview
                   •         Language features




                                                 6
Monday, September 19, 2011
Feature overview
                   •         Language features
                         ➡      Static null-safety guarantees




                                                                6
Monday, September 19, 2011
Feature overview
                   •         Language features
                         ➡      Static null-safety guarantees
                         ➡      Higher-order functions ("closures")




                                                                 6
Monday, September 19, 2011
Feature overview
                   •         Language features
                         ➡      Static null-safety guarantees
                         ➡      Higher-order functions ("closures")
                         ➡      Traits & First-class delegation




                                                                  6
Monday, September 19, 2011
Feature overview
                   •         Language features
                         ➡      Static null-safety guarantees
                         ➡      Higher-order functions ("closures")
                         ➡      Traits & First-class delegation
                         ➡      Properties (no fields)




                                                                  6
Monday, September 19, 2011
Feature overview
                   •         Language features
                         ➡      Static null-safety guarantees
                         ➡      Higher-order functions ("closures")
                         ➡      Traits & First-class delegation
                         ➡      Properties (no fields)
                         ➡      Reified generics




                                                                  6
Monday, September 19, 2011
Feature overview
                   •         Language features
                         ➡      Static null-safety guarantees
                         ➡      Higher-order functions ("closures")
                         ➡      Traits & First-class delegation
                         ➡      Properties (no fields)
                         ➡      Reified generics
                         ➡      Declaration-site variance & "Type projections"




                                                                  6
Monday, September 19, 2011
Feature overview
                   •         Language features
                         ➡      Static null-safety guarantees
                         ➡      Higher-order functions ("closures")
                         ➡      Traits & First-class delegation
                         ➡      Properties (no fields)
                         ➡      Reified generics
                         ➡      Declaration-site variance & "Type projections"
                         ➡      Extension functions




                                                                  6
Monday, September 19, 2011
Feature overview
                   •         Language features
                         ➡      Static null-safety guarantees
                         ➡      Higher-order functions ("closures")
                         ➡      Traits & First-class delegation
                         ➡      Properties (no fields)
                         ➡      Reified generics
                         ➡      Declaration-site variance & "Type projections"
                         ➡      Extension functions
                         ➡      Modules and Build infrastructure




                                                                   6
Monday, September 19, 2011
Feature overview
                   •         Language features
                         ➡      Static null-safety guarantees
                         ➡      Higher-order functions ("closures")
                         ➡      Traits & First-class delegation
                         ➡      Properties (no fields)
                         ➡      Reified generics
                         ➡      Declaration-site variance & "Type projections"
                         ➡      Extension functions
                         ➡      Modules and Build infrastructure
                         ➡      Inline-functions (zero-overhead closures)




                                                                   6
Monday, September 19, 2011
Feature overview
                   •         Language features
                         ➡      Static null-safety guarantees
                         ➡      Higher-order functions ("closures")
                         ➡      Traits & First-class delegation
                         ➡      Properties (no fields)
                         ➡      Reified generics
                         ➡      Declaration-site variance & "Type projections"
                         ➡      Extension functions
                         ➡      Modules and Build infrastructure
                         ➡      Inline-functions (zero-overhead closures)
                         ➡      Pattern matching




                                                                   6
Monday, September 19, 2011
Feature overview
                   •         Language features
                         ➡      Static null-safety guarantees
                         ➡      Higher-order functions ("closures")
                         ➡      Traits & First-class delegation
                         ➡      Properties (no fields)
                         ➡      Reified generics
                         ➡      Declaration-site variance & "Type projections"
                         ➡      Extension functions
                         ➡      Modules and Build infrastructure
                         ➡      Inline-functions (zero-overhead closures)
                         ➡      Pattern matching
                         ➡      ...



                                                                   6
Monday, September 19, 2011
Feature overview
                   •         Language features
                         ➡      Static null-safety guarantees
                         ➡      Higher-order functions ("closures")
                         ➡      Traits & First-class delegation
                         ➡      Properties (no fields)
                         ➡      Reified generics
                         ➡      Declaration-site variance & "Type projections"
                         ➡      Extension functions
                         ➡      Modules and Build infrastructure
                         ➡      Inline-functions (zero-overhead closures)
                         ➡      Pattern matching
                         ➡      ...

                   •         Full-featured IDE by JetBrains from the very beginning

                                                                   6
Monday, September 19, 2011
Code examples
                   •         Functions
                   •         Java interoperability
                   •         String templates
                   •         Local variables
                   •         Type inference
                   •         Extension functions and properties
                   •         Null-safety

                                                     7
Monday, September 19, 2011
Hello, world!
               namespace hello

               fun main(args : Array<String>) : Unit {
                 println("Hello, world!")
               }

               fun println(message : String) {
                   System.out?.println(message)
               }




                                          8
Monday, September 19, 2011
Hello, <names>!
               fun main(args : Array<String>) {
                   var names : String = ""

                        for (i in args.indices) {
                            names += args[i]
                            if (i + 1 < args.size)
                                names += ", "
                        }

                        println("Hello, $names!")
               }

               val Array<*>.indices : Iterable<Int>
                 get() = IntRange<Int>(0, size - 1)




                                               9
Monday, September 19, 2011
Hello, <names>! (Faster version)
               fun main(args : Array<String>) {
                   val names = StringBuilder()

                        for (i in args.indices) {
                            names += args[i]
                            if (i + 1 < args.size)
                                names += ", "
                        }

                        println("Hello, $names!")
               }

               fun StringBuilder.plusAssign(s : String) {
                   this.append(s)
               }



                                               10
Monday, September 19, 2011
Hello, <names>! (Realistic version)
               fun main(args : Array<String>) {
                   println("Hello, ${args.join(", ")}!")
               }

               fun <T> Iterable<T>.join(separator : String) : String {
                   val names = StringBuilder()
                   forit (this) {
                       names += it.next()
                       if (it.hasNext())
                           names += separator
                   }
                   return names.toString()
               }




                                          11
Monday, September 19, 2011
join() and forit()
               fun <T> Iterable<T>.join(separator : String) : String {
                   val names = StringBuilder()
                   forit (this) {
                       names += it.next()
                       if (it.hasNext())
                           names += separator
                   }
                   return names.toString()
               }


               fun <T> forit(col : Iterable<T>, f : fun(Iterator<T>) : Unit) {
                   val it = col.iterator()
                   while (it.hasNext()) {
                       f(it)
                   }
               }

                                           12
Monday, September 19, 2011
Null-safety
               fun parseInt(s      : String) : Int? {
                   try {
                       return      Integer.parseInt(s)
                   } catch (e      : NumberFormatException) {
                       return      null
                   }
               }

               fun main(args : Array<String>) {
                   val x = parseInt("123")
                   val y = parseInt("Hello")
                   print(x?.times(2))        // Can't say: print(x * 2)

                        if (x != null) {
                            print(x * 2)
                        }
               }
                                               13
Monday, September 19, 2011
Types
                                                         Syntax

                                       Class types                    List<Foo>

                                    Nullable types                      Foo?

                                    Function types                fun (Int) : String

                                       Tuple types                (Double, Double)

                                          Self type                     This

                                                      Special types

                                              Top                       Any?

                                          Bottom                       Nothing

                        No meaningful return value                      Unit

                                                           14
Monday, September 19, 2011
Mapping to Java types
                              Kotlin   GEN    Java     LOAD      Kotlin
                              Any            Object              Any?
                              Unit            void               Unit
                              Int             int                 Int
                              Int?           Integer             Int?
                             String          String             String?
                         Array<Foo>          Foo[]            Array<Foo?>?
                         Array<Int>          int[]            Array<Int>?
                             Nothing           -                   -
                              Foo             Foo                Foo?


                                               15
Monday, September 19, 2011
Automatic casts and When
               fun foo(obj : Any?) {
                   if (obj is String) {
                     obj.get(0)
                   }
                   when (obj) {
                       is String => obj.get(0)
                       is Int => obj.plus(1)
                       !is Boolean => null
                   }
               }




                                          16
Monday, September 19, 2011
More on when-expressions
               fun bar(x : Int) {
                   when (x) {
                       0 => "Zero"
                       1, 2, 3 => "1, 2 or 3"
                       x + 1 => "Really strange"
                       in 10..100 => "In range"
                       !in 100..1000 => "Out of range"
                   }
               }




                                          17
Monday, September 19, 2011
Classes
                        open class Parent(p : Bar) {
                            open fun foo() {}
                            fun bar() {}
                        }

                        class Child(p : Bar) : Parent(p) {
                            override fun foo() {}
                        }


                   • Any is the default supertype
                   • Constructors must initialize supertypes
                   • Final by default, explicit override annotations

                                                18
Monday, September 19, 2011
Traits
               trait T1 : Class1, OtherTrait {
                    // No state
               }


               class Foo(p : Bar) : Class1(p), T1, T2 {
                 ...
               }


               class Decorator(p : T2) : Class2, T2 by p {
                    ...
               }


                                           19
Monday, September 19, 2011
Disambiguation
               trait A {
                    fun foo() : Int = 1 // open by default
               }


               open class B() {
                    open fun foo() : Int = 2
               }


               class C() : B(), A {
                    override fun foo() = super<A>.foo()
               }



                                               20
Monday, September 19, 2011
First-class functions
                   •         Functions
                         ➡     fun f(p : Int) : String

                   •         Function types
                         ➡     fun (p : Int) : String
                         ➡     fun (Int) : String

                   •         Function literals
                         ➡     {p => p.toString()}
                         ➡     {(p : Int) => p.toString()}
                         ➡     {(p : Int) : String => p.toString()}


                                                    21
Monday, September 19, 2011
Higher-order functions
                  fun <T> filter(
                            c : Iterable<T>,
                            f : fun(T) : Boolean) : Iterable<T>

               • filter(list,                 {s => s.length < 3})
                         ➡   Sugar: last function literal argument
                             ✦   filter(list) {s => s.length < 3}
                         ➡   Sugar: one-parameter function literal
                             ✦   filter(list) { it.length < 3 }


                                                 22
Monday, September 19, 2011
Infix function calls: "LINQ"
                  a.contains(b)

                  // is the same as

                  a contains b



                  users

                             filter { it hasPrivilege WRITE }

                             map { it => it.fullName }

                             orderBy { lastName }


                                                23
Monday, September 19, 2011
Lock example (I)
               myLock.lock()
               try {
                    // Do something
               }
               finally {
                    myLock.unlock()
               }




                                      24
Monday, September 19, 2011
Lock example (II)

               lock(myLock) {
                    // Do something
               }




               fun lock(l : Lock, body : fun () : Unit)


                                      25
Monday, September 19, 2011
Lock example (III)
               inline fun lock(l : Lock, body : fun () : Unit) {
                    myLock.lock()
                    try {
                         body()
                    }
                    finally {
                         myLock.unlock()
                    }
               }


                                           26
Monday, September 19, 2011
Extension functions
                   •         Functions
                         ➡     fun Foo.f(p : Int) : String

                   •         Function types
                         ➡     fun Foo.(p : Int) : String
                         ➡     fun Foo.(Int) : String

                   •         Function literals
                         ➡     {Foo.(p : Int) => this.toString()}
                         ➡     {Foo.(p : Int) : String => this.toString()}



                                                 27
Monday, September 19, 2011
Builders in Groovy
               html {
                     head {
                         title "XML encoding with Groovy"
                     }
                     body {
                         h1 "XML encoding with Groovy"
                         p "this format can be used as an alternative markup to XML"


                         /* an element with attributes and text content */
                         ahref:'http://groovy.codehaus.org' ["Groovy"]
                     }
               }



                                                   28
Monday, September 19, 2011
Builders in Kotlin
               html {
                     head {
                         title { +"XML encoding with Kotlin" }
                     }
                     body {
                         h1 { +"XML encoding with Kotlin" }
                         p { +"this format is now type-safe" }


                         /* an element with attributes and text content */
                         a(href="http://jetbrains.com/kotlin") { +"Kotlin" }
                     }
               }



                                                   29
Monday, September 19, 2011
Builders: Implementation (I)
                   •         Function definition

                             fun html(init : fun HTML.() : Unit) : HTML {
                               val html = HTML()
                               html.init()
                               return html
                             }
                   •         Usage

                             html {
                               this.head { ... }
                             }


                                                   30
Monday, September 19, 2011
Builders: Implementation (II)
                   •         Function definition

                             fun html(init : fun HTML.() : Unit) : HTML {
                               val html = HTML()
                               html.init()
                               return html
                             }
                   •         Usage

                             html {
                               head { ... }
                             }


                                                   31
Monday, September 19, 2011
Builders: Implementation (III)
               abstract class Tag(val name : String) : Element {
                   val children = ArrayList<Element>()
                   val attributes = HashMap<String, String>()
               }

               abstract class TagWithText(name : String) : Tag(name) {
                   fun String.plus() {
                     children.add(TextElement(this))
                   }
               }

               class HTML() : TagWithText("html") {
                   fun head(init : fun Head.() : Unit) { }
                   fun body(init : fun Body.() : Unit) { }
               }



                                          32
Monday, September 19, 2011
Builders in Kotlin
               html {
                     head {
                         title { +"XML encoding with Kotlin" }
                     }
                     body {
                         h1 { +"XML encoding with Kotlin" }
                         p { +"this format is now type-safe" }


                         /* an element with attributes and text content */
                         a(href="http://jetbrains.com/kotlin") { +"Kotlin" }
                     }
               }



                                                   33
Monday, September 19, 2011
Generics: Invariance
               class List<T> {
                     fun add(t : T)
                     fun get(index : Int) : T
               }


               val ints = List<Int>()
               val anys : List<Any> = ints
               anys.add("1") // Cause of the problem
               val i : Int = ints.get(0) // !!!
                                        34
Monday, September 19, 2011
Generics: Invariance
               class List<T> {
                     fun add(t : T)
                     fun get(index : Int) : T
               }


               val ints = List<Int>()
               val anys : List<Any> = ints
               anys.add("1") // Cause of the problem
               val i : Int = ints.get(0) // !!!
                                        34
Monday, September 19, 2011
Generics: Declaration-site variance
               class List<T> {           List<Int> >:< List<Any>
                   fun add(t : T)        val ints = List<Int>()
                   fun get() : T         val anys : List<Any> = ints
               }




               class Producer<out T> {   val ints = Producer<Int>()
                   fun get() : T         val anys : Producer<Any> = ints
               }


               class Consumer<in T> {    val anys = Consumer<Any>()
                   fun add(t : T)        val ints : Consumer<Int> = anys
               }



                                            35
Monday, September 19, 2011
Generics: Declaration-site variance
               class List<T> {           List<Int> >:< List<Any>
                   fun add(t : T)        val ints = List<Int>()
                   fun get() : T         val anys : List<Any> = ints
               }




               class Producer<out T> {   val ints = Producer<Int>()
                   fun get() : T         val anys : Producer<Any> = ints
               }


               class Consumer<in T> {    val anys = Consumer<Any>()
                   fun add(t : T)        val ints : Consumer<Int> = anys
               }



                                            35
Monday, September 19, 2011
Generics: Declaration-site variance
               class List<T> {           List<Int> >:< List<Any>
                   fun add(t : T)        val ints = List<Int>()
                   fun get() : T         val anys : List<Any> = ints
               }




               class Producer<out T> {   val ints = Producer<Int>()
                   fun get() : T         val anys : Producer<Any> = ints
               }


               class Consumer<in T> {    val anys = Consumer<Any>()
                   fun add(t : T)        val ints : Consumer<Int> = anys
               }



                                            35
Monday, September 19, 2011
Generics: Use-site variance
               val ints = List<Int>()
               val anysOut : List<out Any> = ints
               anysOut.add("1") // Not available
               val i : Int = ints.get() // No problem




                                    36
Monday, September 19, 2011
Generics: Use-site variance
               val ints = List<Int>()
               val anysOut : List<out Any> = ints
               anysOut.add("1") // Not available
               val i : Int = ints.get() // No problem

               val anys = List<Any>()
               val intsIn : List<in Int> = anys
               intsIn.add(0)
               val obj = intsIn.get() // : Any?

                                    36
Monday, September 19, 2011
Reified generics
                   • Type information in retained at runtime
                         ➡   foo is List<T>
                         ➡   Array<T>(3)
                         ➡   T.create()

                   • Java types are still erased
                         ➡   foo is java.util.List<*>



                                           37
Monday, September 19, 2011
Resources
                   • Documentation:
                         ➡   http://jetbrains.com/kotlin

                   • Blog:
                         ➡   http://blog.jetbrains.com/kotlin

                   • Twitter:
                         ➡   @project_kotlin
                         ➡   @abreslav

                                                 38
Monday, September 19, 2011

Weitere ähnliche Inhalte

Andere mochten auch

Kotlin (Introduction for students)
Kotlin (Introduction for students)Kotlin (Introduction for students)
Kotlin (Introduction for students)Andrey Breslav
 
Language Design Trade-offs
Language Design Trade-offsLanguage Design Trade-offs
Language Design Trade-offsAndrey Breslav
 
[JVMLS 12] Kotlin / Java Interop
[JVMLS 12] Kotlin / Java Interop[JVMLS 12] Kotlin / Java Interop
[JVMLS 12] Kotlin / Java InteropAndrey Breslav
 
Kotlin gets Reflection
Kotlin gets ReflectionKotlin gets Reflection
Kotlin gets ReflectionAndrey Breslav
 
Kotlin @ CSClub & Yandex
Kotlin @ CSClub & YandexKotlin @ CSClub & Yandex
Kotlin @ CSClub & YandexAndrey Breslav
 
Kotlin Slides from Devoxx 2011
Kotlin Slides from Devoxx 2011Kotlin Slides from Devoxx 2011
Kotlin Slides from Devoxx 2011Andrey Breslav
 
Flexible Types in Kotlin - JVMLS 2015
Flexible Types in Kotlin - JVMLS 2015Flexible Types in Kotlin - JVMLS 2015
Flexible Types in Kotlin - JVMLS 2015Andrey Breslav
 
Introduction to Kotlin: Brief and clear
Introduction to Kotlin: Brief and clearIntroduction to Kotlin: Brief and clear
Introduction to Kotlin: Brief and clearAndrey Breslav
 
JVMLS 2016. Coroutines in Kotlin
JVMLS 2016. Coroutines in KotlinJVMLS 2016. Coroutines in Kotlin
JVMLS 2016. Coroutines in KotlinAndrey Breslav
 
Светлана Исакова «Язык Kotlin»
Светлана Исакова «Язык Kotlin»Светлана Исакова «Язык Kotlin»
Светлана Исакова «Язык Kotlin»e-Legion
 
Be More Productive with Kotlin
Be More Productive with KotlinBe More Productive with Kotlin
Be More Productive with KotlinBrandon Wever
 
Who's More Functional: Kotlin, Groovy, Scala, or Java?
Who's More Functional: Kotlin, Groovy, Scala, or Java?Who's More Functional: Kotlin, Groovy, Scala, or Java?
Who's More Functional: Kotlin, Groovy, Scala, or Java?Andrey Breslav
 
Category theory, Monads, and Duality in the world of (BIG) Data
Category theory, Monads, and Duality in the world of (BIG) DataCategory theory, Monads, and Duality in the world of (BIG) Data
Category theory, Monads, and Duality in the world of (BIG) Datagreenwop
 
Functional Reactive Programming with Kotlin on Android - Giorgio Natili - Cod...
Functional Reactive Programming with Kotlin on Android - Giorgio Natili - Cod...Functional Reactive Programming with Kotlin on Android - Giorgio Natili - Cod...
Functional Reactive Programming with Kotlin on Android - Giorgio Natili - Cod...Codemotion
 

Andere mochten auch (16)

Kotlin (Introduction for students)
Kotlin (Introduction for students)Kotlin (Introduction for students)
Kotlin (Introduction for students)
 
Language Design Trade-offs
Language Design Trade-offsLanguage Design Trade-offs
Language Design Trade-offs
 
[JVMLS 12] Kotlin / Java Interop
[JVMLS 12] Kotlin / Java Interop[JVMLS 12] Kotlin / Java Interop
[JVMLS 12] Kotlin / Java Interop
 
Kotlin gets Reflection
Kotlin gets ReflectionKotlin gets Reflection
Kotlin gets Reflection
 
Kotlin @ CSClub & Yandex
Kotlin @ CSClub & YandexKotlin @ CSClub & Yandex
Kotlin @ CSClub & Yandex
 
Eval4j @ JVMLS 2014
Eval4j @ JVMLS 2014Eval4j @ JVMLS 2014
Eval4j @ JVMLS 2014
 
Kotlin Slides from Devoxx 2011
Kotlin Slides from Devoxx 2011Kotlin Slides from Devoxx 2011
Kotlin Slides from Devoxx 2011
 
Flexible Types in Kotlin - JVMLS 2015
Flexible Types in Kotlin - JVMLS 2015Flexible Types in Kotlin - JVMLS 2015
Flexible Types in Kotlin - JVMLS 2015
 
Kotlin @ Devoxx 2011
Kotlin @ Devoxx 2011Kotlin @ Devoxx 2011
Kotlin @ Devoxx 2011
 
Introduction to Kotlin: Brief and clear
Introduction to Kotlin: Brief and clearIntroduction to Kotlin: Brief and clear
Introduction to Kotlin: Brief and clear
 
JVMLS 2016. Coroutines in Kotlin
JVMLS 2016. Coroutines in KotlinJVMLS 2016. Coroutines in Kotlin
JVMLS 2016. Coroutines in Kotlin
 
Светлана Исакова «Язык Kotlin»
Светлана Исакова «Язык Kotlin»Светлана Исакова «Язык Kotlin»
Светлана Исакова «Язык Kotlin»
 
Be More Productive with Kotlin
Be More Productive with KotlinBe More Productive with Kotlin
Be More Productive with Kotlin
 
Who's More Functional: Kotlin, Groovy, Scala, or Java?
Who's More Functional: Kotlin, Groovy, Scala, or Java?Who's More Functional: Kotlin, Groovy, Scala, or Java?
Who's More Functional: Kotlin, Groovy, Scala, or Java?
 
Category theory, Monads, and Duality in the world of (BIG) Data
Category theory, Monads, and Duality in the world of (BIG) DataCategory theory, Monads, and Duality in the world of (BIG) Data
Category theory, Monads, and Duality in the world of (BIG) Data
 
Functional Reactive Programming with Kotlin on Android - Giorgio Natili - Cod...
Functional Reactive Programming with Kotlin on Android - Giorgio Natili - Cod...Functional Reactive Programming with Kotlin on Android - Giorgio Natili - Cod...
Functional Reactive Programming with Kotlin on Android - Giorgio Natili - Cod...
 

Ähnlich wie Kotlin @ StrangeLoop 2011

DCI - Data, Context and Interaction @ Jug Lugano May 2011
DCI - Data, Context and Interaction @ Jug Lugano May 2011 DCI - Data, Context and Interaction @ Jug Lugano May 2011
DCI - Data, Context and Interaction @ Jug Lugano May 2011 Fabrizio Giudici
 
Building Languages for the JVM - StarTechConf 2011
Building Languages for the JVM - StarTechConf 2011Building Languages for the JVM - StarTechConf 2011
Building Languages for the JVM - StarTechConf 2011Charles Nutter
 
Kotlin vs Java-A Comparison for Application Development Projects.pdf
Kotlin vs Java-A Comparison for Application Development Projects.pdfKotlin vs Java-A Comparison for Application Development Projects.pdf
Kotlin vs Java-A Comparison for Application Development Projects.pdfTechugo
 
Grokking TechTalk #26: Kotlin, Understand the Magic
Grokking TechTalk #26: Kotlin, Understand the MagicGrokking TechTalk #26: Kotlin, Understand the Magic
Grokking TechTalk #26: Kotlin, Understand the MagicGrokking VN
 
Pragmatic Smalltalk
Pragmatic SmalltalkPragmatic Smalltalk
Pragmatic SmalltalkESUG
 
2011 JavaOne Fun with EJB 3.1 and OpenEJB
2011 JavaOne Fun with EJB 3.1 and OpenEJB2011 JavaOne Fun with EJB 3.1 and OpenEJB
2011 JavaOne Fun with EJB 3.1 and OpenEJBDavid Blevins
 
Plone IDE - the future of Plone development
Plone IDE - the future of Plone developmentPlone IDE - the future of Plone development
Plone IDE - the future of Plone developmentMikko Ohtamaa
 
Developers’ mDay u Banjoj Luci - Duško Bajić, Kotlin User Group Bosnia – Kotl...
Developers’ mDay u Banjoj Luci - Duško Bajić, Kotlin User Group Bosnia – Kotl...Developers’ mDay u Banjoj Luci - Duško Bajić, Kotlin User Group Bosnia – Kotl...
Developers’ mDay u Banjoj Luci - Duško Bajić, Kotlin User Group Bosnia – Kotl...mCloud
 
Kotlin for android development
Kotlin for android developmentKotlin for android development
Kotlin for android developmentJalpesh Vasa
 

Ähnlich wie Kotlin @ StrangeLoop 2011 (15)

DCI - Data, Context and Interaction @ Jug Lugano May 2011
DCI - Data, Context and Interaction @ Jug Lugano May 2011 DCI - Data, Context and Interaction @ Jug Lugano May 2011
DCI - Data, Context and Interaction @ Jug Lugano May 2011
 
Building Languages for the JVM - StarTechConf 2011
Building Languages for the JVM - StarTechConf 2011Building Languages for the JVM - StarTechConf 2011
Building Languages for the JVM - StarTechConf 2011
 
Kotlin
KotlinKotlin
Kotlin
 
A new world with cdi en
A new world with cdi enA new world with cdi en
A new world with cdi en
 
Kotlin vs Java-A Comparison for Application Development Projects.pdf
Kotlin vs Java-A Comparison for Application Development Projects.pdfKotlin vs Java-A Comparison for Application Development Projects.pdf
Kotlin vs Java-A Comparison for Application Development Projects.pdf
 
Grokking TechTalk #26: Kotlin, Understand the Magic
Grokking TechTalk #26: Kotlin, Understand the MagicGrokking TechTalk #26: Kotlin, Understand the Magic
Grokking TechTalk #26: Kotlin, Understand the Magic
 
Pragmatic Smalltalk
Pragmatic SmalltalkPragmatic Smalltalk
Pragmatic Smalltalk
 
Capitol js
Capitol jsCapitol js
Capitol js
 
Webops dashboards
Webops dashboardsWebops dashboards
Webops dashboards
 
2011 JavaOne Fun with EJB 3.1 and OpenEJB
2011 JavaOne Fun with EJB 3.1 and OpenEJB2011 JavaOne Fun with EJB 3.1 and OpenEJB
2011 JavaOne Fun with EJB 3.1 and OpenEJB
 
Plone IDE - the future of Plone development
Plone IDE - the future of Plone developmentPlone IDE - the future of Plone development
Plone IDE - the future of Plone development
 
Developers’ mDay u Banjoj Luci - Duško Bajić, Kotlin User Group Bosnia – Kotl...
Developers’ mDay u Banjoj Luci - Duško Bajić, Kotlin User Group Bosnia – Kotl...Developers’ mDay u Banjoj Luci - Duško Bajić, Kotlin User Group Bosnia – Kotl...
Developers’ mDay u Banjoj Luci - Duško Bajić, Kotlin User Group Bosnia – Kotl...
 
Slides kotlin yajug
Slides kotlin yajugSlides kotlin yajug
Slides kotlin yajug
 
Kotlin for android development
Kotlin for android developmentKotlin for android development
Kotlin for android development
 
Intro to Kotlin
Intro to KotlinIntro to Kotlin
Intro to Kotlin
 

Kürzlich hochgeladen

The Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsThe Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsPixlogix Infotech
 
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage CostLeverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage CostZilliz
 
SAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxSAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxNavinnSomaal
 
Take control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteTake control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteDianaGray10
 
Gen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfGen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfAddepto
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):comworks
 
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Manik S Magar
 
Hyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdf
Hyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdfHyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdf
Hyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdfPrecisely
 
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Mark Simos
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Scott Keck-Warren
 
DSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningDSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningLars Bell
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationSlibray Presentation
 
Artificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxArtificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxhariprasad279825
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024Lorenzo Miniero
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Commit University
 
H2O.ai CEO/Founder: Sri Ambati Keynote at Wells Fargo Day
H2O.ai CEO/Founder: Sri Ambati Keynote at Wells Fargo DayH2O.ai CEO/Founder: Sri Ambati Keynote at Wells Fargo Day
H2O.ai CEO/Founder: Sri Ambati Keynote at Wells Fargo DaySri Ambati
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsMark Billinghurst
 
Unleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubUnleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubKalema Edgar
 
From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .Alan Dix
 

Kürzlich hochgeladen (20)

The Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsThe Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and Cons
 
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage CostLeverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
 
SAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxSAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptx
 
Take control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteTake control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test Suite
 
Gen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfGen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdf
 
DMCC Future of Trade Web3 - Special Edition
DMCC Future of Trade Web3 - Special EditionDMCC Future of Trade Web3 - Special Edition
DMCC Future of Trade Web3 - Special Edition
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):
 
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!
 
Hyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdf
Hyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdfHyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdf
Hyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdf
 
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024
 
DSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningDSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine Tuning
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck Presentation
 
Artificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxArtificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptx
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!
 
H2O.ai CEO/Founder: Sri Ambati Keynote at Wells Fargo Day
H2O.ai CEO/Founder: Sri Ambati Keynote at Wells Fargo DayH2O.ai CEO/Founder: Sri Ambati Keynote at Wells Fargo Day
H2O.ai CEO/Founder: Sri Ambati Keynote at Wells Fargo Day
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR Systems
 
Unleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubUnleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding Club
 
From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .
 

Kotlin @ StrangeLoop 2011

  • 1. The Kotlin Programming Language Andrey Breslav Monday, September 19, 2011
  • 2. What is Kotlin? 2 Monday, September 19, 2011
  • 3. What is Kotlin? • Statically typed 2 Monday, September 19, 2011
  • 4. What is Kotlin? • Statically typed • object-oriented 2 Monday, September 19, 2011
  • 5. What is Kotlin? • Statically typed • object-oriented • JVM-targeted 2 Monday, September 19, 2011
  • 6. What is Kotlin? • Statically typed • object-oriented • JVM-targeted • general-purpose 2 Monday, September 19, 2011
  • 7. What is Kotlin? • Statically typed • object-oriented • JVM-targeted • general-purpose • programming language 2 Monday, September 19, 2011
  • 8. What is Kotlin? • Statically typed • object-oriented • JVM-targeted • general-purpose • programming language • developed by JetBrains 2 Monday, September 19, 2011
  • 9. What is Kotlin? • Statically typed • object-oriented • JVM-targeted • general-purpose • programming language • developed by JetBrains ➡ intended for industrial use 2 Monday, September 19, 2011
  • 10. What is Kotlin? • Statically typed • object-oriented • JVM-targeted • general-purpose • programming language • developed by JetBrains ➡ intended for industrial use • Docs available today 2 Monday, September 19, 2011
  • 11. What is Kotlin? • Statically typed • object-oriented • JVM-targeted • general-purpose • programming language • developed by JetBrains ➡ intended for industrial use • Docs available today • Public beta is planned for the end of 2011 2 Monday, September 19, 2011
  • 12. Goal-wise... 3 Monday, September 19, 2011
  • 13. Goal-wise... • Number of research papers we are planning to publish on Kotlin is 3 Monday, September 19, 2011
  • 14. Goal-wise... • Number of research papers we are planning to publish on Kotlin is ➡ Zero 3 Monday, September 19, 2011
  • 15. Goal-wise... • Number of research papers we are planning to publish on Kotlin is ➡ Zero ➡ ... or really close to that 3 Monday, September 19, 2011
  • 16. Outline • Motivation • Feature overview • Basic syntax • Classes and Types • Higher-order functions • Type-safe Groovy-style Builders 4 Monday, September 19, 2011
  • 17. Motivation 5 Monday, September 19, 2011
  • 18. Motivation • Why a new language? 5 Monday, September 19, 2011
  • 19. Motivation • Why a new language? ➡ We are not satisfied with the existing ones ➡ And we have had a close look at many of them over 10 years 5 Monday, September 19, 2011
  • 20. Motivation • Why a new language? ➡ We are not satisfied with the existing ones ➡ And we have had a close look at many of them over 10 years • Design goals 5 Monday, September 19, 2011
  • 21. Motivation • Why a new language? ➡ We are not satisfied with the existing ones ➡ And we have had a close look at many of them over 10 years • Design goals ➡ Full Java interoperability 5 Monday, September 19, 2011
  • 22. Motivation • Why a new language? ➡ We are not satisfied with the existing ones ➡ And we have had a close look at many of them over 10 years • Design goals ➡ Full Java interoperability ➡ Compiles as fast as Java 5 Monday, September 19, 2011
  • 23. Motivation • Why a new language? ➡ We are not satisfied with the existing ones ➡ And we have had a close look at many of them over 10 years • Design goals ➡ Full Java interoperability ➡ Compiles as fast as Java ➡ Safer than Java 5 Monday, September 19, 2011
  • 24. Motivation • Why a new language? ➡ We are not satisfied with the existing ones ➡ And we have had a close look at many of them over 10 years • Design goals ➡ Full Java interoperability ➡ Compiles as fast as Java ➡ Safer than Java ➡ More concise than Java 5 Monday, September 19, 2011
  • 25. Motivation • Why a new language? ➡ We are not satisfied with the existing ones ➡ And we have had a close look at many of them over 10 years • Design goals ➡ Full Java interoperability ➡ Compiles as fast as Java ➡ Safer than Java ➡ More concise than Java ➡ Way simpler than Scala 5 Monday, September 19, 2011
  • 26. Feature overview 6 Monday, September 19, 2011
  • 27. Feature overview • Language features 6 Monday, September 19, 2011
  • 28. Feature overview • Language features ➡ Static null-safety guarantees 6 Monday, September 19, 2011
  • 29. Feature overview • Language features ➡ Static null-safety guarantees ➡ Higher-order functions ("closures") 6 Monday, September 19, 2011
  • 30. Feature overview • Language features ➡ Static null-safety guarantees ➡ Higher-order functions ("closures") ➡ Traits & First-class delegation 6 Monday, September 19, 2011
  • 31. Feature overview • Language features ➡ Static null-safety guarantees ➡ Higher-order functions ("closures") ➡ Traits & First-class delegation ➡ Properties (no fields) 6 Monday, September 19, 2011
  • 32. Feature overview • Language features ➡ Static null-safety guarantees ➡ Higher-order functions ("closures") ➡ Traits & First-class delegation ➡ Properties (no fields) ➡ Reified generics 6 Monday, September 19, 2011
  • 33. Feature overview • Language features ➡ Static null-safety guarantees ➡ Higher-order functions ("closures") ➡ Traits & First-class delegation ➡ Properties (no fields) ➡ Reified generics ➡ Declaration-site variance & "Type projections" 6 Monday, September 19, 2011
  • 34. Feature overview • Language features ➡ Static null-safety guarantees ➡ Higher-order functions ("closures") ➡ Traits & First-class delegation ➡ Properties (no fields) ➡ Reified generics ➡ Declaration-site variance & "Type projections" ➡ Extension functions 6 Monday, September 19, 2011
  • 35. Feature overview • Language features ➡ Static null-safety guarantees ➡ Higher-order functions ("closures") ➡ Traits & First-class delegation ➡ Properties (no fields) ➡ Reified generics ➡ Declaration-site variance & "Type projections" ➡ Extension functions ➡ Modules and Build infrastructure 6 Monday, September 19, 2011
  • 36. Feature overview • Language features ➡ Static null-safety guarantees ➡ Higher-order functions ("closures") ➡ Traits & First-class delegation ➡ Properties (no fields) ➡ Reified generics ➡ Declaration-site variance & "Type projections" ➡ Extension functions ➡ Modules and Build infrastructure ➡ Inline-functions (zero-overhead closures) 6 Monday, September 19, 2011
  • 37. Feature overview • Language features ➡ Static null-safety guarantees ➡ Higher-order functions ("closures") ➡ Traits & First-class delegation ➡ Properties (no fields) ➡ Reified generics ➡ Declaration-site variance & "Type projections" ➡ Extension functions ➡ Modules and Build infrastructure ➡ Inline-functions (zero-overhead closures) ➡ Pattern matching 6 Monday, September 19, 2011
  • 38. Feature overview • Language features ➡ Static null-safety guarantees ➡ Higher-order functions ("closures") ➡ Traits & First-class delegation ➡ Properties (no fields) ➡ Reified generics ➡ Declaration-site variance & "Type projections" ➡ Extension functions ➡ Modules and Build infrastructure ➡ Inline-functions (zero-overhead closures) ➡ Pattern matching ➡ ... 6 Monday, September 19, 2011
  • 39. Feature overview • Language features ➡ Static null-safety guarantees ➡ Higher-order functions ("closures") ➡ Traits & First-class delegation ➡ Properties (no fields) ➡ Reified generics ➡ Declaration-site variance & "Type projections" ➡ Extension functions ➡ Modules and Build infrastructure ➡ Inline-functions (zero-overhead closures) ➡ Pattern matching ➡ ... • Full-featured IDE by JetBrains from the very beginning 6 Monday, September 19, 2011
  • 40. Code examples • Functions • Java interoperability • String templates • Local variables • Type inference • Extension functions and properties • Null-safety 7 Monday, September 19, 2011
  • 41. Hello, world! namespace hello fun main(args : Array<String>) : Unit { println("Hello, world!") } fun println(message : String) { System.out?.println(message) } 8 Monday, September 19, 2011
  • 42. Hello, <names>! fun main(args : Array<String>) { var names : String = "" for (i in args.indices) { names += args[i] if (i + 1 < args.size) names += ", " } println("Hello, $names!") } val Array<*>.indices : Iterable<Int> get() = IntRange<Int>(0, size - 1) 9 Monday, September 19, 2011
  • 43. Hello, <names>! (Faster version) fun main(args : Array<String>) { val names = StringBuilder() for (i in args.indices) { names += args[i] if (i + 1 < args.size) names += ", " } println("Hello, $names!") } fun StringBuilder.plusAssign(s : String) { this.append(s) } 10 Monday, September 19, 2011
  • 44. Hello, <names>! (Realistic version) fun main(args : Array<String>) { println("Hello, ${args.join(", ")}!") } fun <T> Iterable<T>.join(separator : String) : String { val names = StringBuilder() forit (this) { names += it.next() if (it.hasNext()) names += separator } return names.toString() } 11 Monday, September 19, 2011
  • 45. join() and forit() fun <T> Iterable<T>.join(separator : String) : String { val names = StringBuilder() forit (this) { names += it.next() if (it.hasNext()) names += separator } return names.toString() } fun <T> forit(col : Iterable<T>, f : fun(Iterator<T>) : Unit) { val it = col.iterator() while (it.hasNext()) { f(it) } } 12 Monday, September 19, 2011
  • 46. Null-safety fun parseInt(s : String) : Int? { try { return Integer.parseInt(s) } catch (e : NumberFormatException) { return null } } fun main(args : Array<String>) { val x = parseInt("123") val y = parseInt("Hello") print(x?.times(2)) // Can't say: print(x * 2) if (x != null) { print(x * 2) } } 13 Monday, September 19, 2011
  • 47. Types Syntax Class types List<Foo> Nullable types Foo? Function types fun (Int) : String Tuple types (Double, Double) Self type This Special types Top Any? Bottom Nothing No meaningful return value Unit 14 Monday, September 19, 2011
  • 48. Mapping to Java types Kotlin GEN Java LOAD Kotlin Any Object Any? Unit void Unit Int int Int Int? Integer Int? String String String? Array<Foo> Foo[] Array<Foo?>? Array<Int> int[] Array<Int>? Nothing - - Foo Foo Foo? 15 Monday, September 19, 2011
  • 49. Automatic casts and When fun foo(obj : Any?) { if (obj is String) { obj.get(0) } when (obj) { is String => obj.get(0) is Int => obj.plus(1) !is Boolean => null } } 16 Monday, September 19, 2011
  • 50. More on when-expressions fun bar(x : Int) { when (x) { 0 => "Zero" 1, 2, 3 => "1, 2 or 3" x + 1 => "Really strange" in 10..100 => "In range" !in 100..1000 => "Out of range" } } 17 Monday, September 19, 2011
  • 51. Classes open class Parent(p : Bar) { open fun foo() {} fun bar() {} } class Child(p : Bar) : Parent(p) { override fun foo() {} } • Any is the default supertype • Constructors must initialize supertypes • Final by default, explicit override annotations 18 Monday, September 19, 2011
  • 52. Traits trait T1 : Class1, OtherTrait { // No state } class Foo(p : Bar) : Class1(p), T1, T2 { ... } class Decorator(p : T2) : Class2, T2 by p { ... } 19 Monday, September 19, 2011
  • 53. Disambiguation trait A { fun foo() : Int = 1 // open by default } open class B() { open fun foo() : Int = 2 } class C() : B(), A { override fun foo() = super<A>.foo() } 20 Monday, September 19, 2011
  • 54. First-class functions • Functions ➡ fun f(p : Int) : String • Function types ➡ fun (p : Int) : String ➡ fun (Int) : String • Function literals ➡ {p => p.toString()} ➡ {(p : Int) => p.toString()} ➡ {(p : Int) : String => p.toString()} 21 Monday, September 19, 2011
  • 55. Higher-order functions fun <T> filter( c : Iterable<T>, f : fun(T) : Boolean) : Iterable<T> • filter(list, {s => s.length < 3}) ➡ Sugar: last function literal argument ✦ filter(list) {s => s.length < 3} ➡ Sugar: one-parameter function literal ✦ filter(list) { it.length < 3 } 22 Monday, September 19, 2011
  • 56. Infix function calls: "LINQ" a.contains(b) // is the same as a contains b users filter { it hasPrivilege WRITE } map { it => it.fullName } orderBy { lastName } 23 Monday, September 19, 2011
  • 57. Lock example (I) myLock.lock() try { // Do something } finally { myLock.unlock() } 24 Monday, September 19, 2011
  • 58. Lock example (II) lock(myLock) { // Do something } fun lock(l : Lock, body : fun () : Unit) 25 Monday, September 19, 2011
  • 59. Lock example (III) inline fun lock(l : Lock, body : fun () : Unit) { myLock.lock() try { body() } finally { myLock.unlock() } } 26 Monday, September 19, 2011
  • 60. Extension functions • Functions ➡ fun Foo.f(p : Int) : String • Function types ➡ fun Foo.(p : Int) : String ➡ fun Foo.(Int) : String • Function literals ➡ {Foo.(p : Int) => this.toString()} ➡ {Foo.(p : Int) : String => this.toString()} 27 Monday, September 19, 2011
  • 61. Builders in Groovy html { head { title "XML encoding with Groovy" } body { h1 "XML encoding with Groovy" p "this format can be used as an alternative markup to XML" /* an element with attributes and text content */ ahref:'http://groovy.codehaus.org' ["Groovy"] } } 28 Monday, September 19, 2011
  • 62. Builders in Kotlin html { head { title { +"XML encoding with Kotlin" } } body { h1 { +"XML encoding with Kotlin" } p { +"this format is now type-safe" } /* an element with attributes and text content */ a(href="http://jetbrains.com/kotlin") { +"Kotlin" } } } 29 Monday, September 19, 2011
  • 63. Builders: Implementation (I) • Function definition fun html(init : fun HTML.() : Unit) : HTML { val html = HTML() html.init() return html } • Usage html { this.head { ... } } 30 Monday, September 19, 2011
  • 64. Builders: Implementation (II) • Function definition fun html(init : fun HTML.() : Unit) : HTML { val html = HTML() html.init() return html } • Usage html { head { ... } } 31 Monday, September 19, 2011
  • 65. Builders: Implementation (III) abstract class Tag(val name : String) : Element { val children = ArrayList<Element>() val attributes = HashMap<String, String>() } abstract class TagWithText(name : String) : Tag(name) { fun String.plus() { children.add(TextElement(this)) } } class HTML() : TagWithText("html") { fun head(init : fun Head.() : Unit) { } fun body(init : fun Body.() : Unit) { } } 32 Monday, September 19, 2011
  • 66. Builders in Kotlin html { head { title { +"XML encoding with Kotlin" } } body { h1 { +"XML encoding with Kotlin" } p { +"this format is now type-safe" } /* an element with attributes and text content */ a(href="http://jetbrains.com/kotlin") { +"Kotlin" } } } 33 Monday, September 19, 2011
  • 67. Generics: Invariance class List<T> { fun add(t : T) fun get(index : Int) : T } val ints = List<Int>() val anys : List<Any> = ints anys.add("1") // Cause of the problem val i : Int = ints.get(0) // !!! 34 Monday, September 19, 2011
  • 68. Generics: Invariance class List<T> { fun add(t : T) fun get(index : Int) : T } val ints = List<Int>() val anys : List<Any> = ints anys.add("1") // Cause of the problem val i : Int = ints.get(0) // !!! 34 Monday, September 19, 2011
  • 69. Generics: Declaration-site variance class List<T> { List<Int> >:< List<Any> fun add(t : T) val ints = List<Int>() fun get() : T val anys : List<Any> = ints } class Producer<out T> { val ints = Producer<Int>() fun get() : T val anys : Producer<Any> = ints } class Consumer<in T> { val anys = Consumer<Any>() fun add(t : T) val ints : Consumer<Int> = anys } 35 Monday, September 19, 2011
  • 70. Generics: Declaration-site variance class List<T> { List<Int> >:< List<Any> fun add(t : T) val ints = List<Int>() fun get() : T val anys : List<Any> = ints } class Producer<out T> { val ints = Producer<Int>() fun get() : T val anys : Producer<Any> = ints } class Consumer<in T> { val anys = Consumer<Any>() fun add(t : T) val ints : Consumer<Int> = anys } 35 Monday, September 19, 2011
  • 71. Generics: Declaration-site variance class List<T> { List<Int> >:< List<Any> fun add(t : T) val ints = List<Int>() fun get() : T val anys : List<Any> = ints } class Producer<out T> { val ints = Producer<Int>() fun get() : T val anys : Producer<Any> = ints } class Consumer<in T> { val anys = Consumer<Any>() fun add(t : T) val ints : Consumer<Int> = anys } 35 Monday, September 19, 2011
  • 72. Generics: Use-site variance val ints = List<Int>() val anysOut : List<out Any> = ints anysOut.add("1") // Not available val i : Int = ints.get() // No problem 36 Monday, September 19, 2011
  • 73. Generics: Use-site variance val ints = List<Int>() val anysOut : List<out Any> = ints anysOut.add("1") // Not available val i : Int = ints.get() // No problem val anys = List<Any>() val intsIn : List<in Int> = anys intsIn.add(0) val obj = intsIn.get() // : Any? 36 Monday, September 19, 2011
  • 74. Reified generics • Type information in retained at runtime ➡ foo is List<T> ➡ Array<T>(3) ➡ T.create() • Java types are still erased ➡ foo is java.util.List<*> 37 Monday, September 19, 2011
  • 75. Resources • Documentation: ➡ http://jetbrains.com/kotlin • Blog: ➡ http://blog.jetbrains.com/kotlin • Twitter: ➡ @project_kotlin ➡ @abreslav 38 Monday, September 19, 2011