Upgrade to Pro — share decks privately, control downloads, hide ads and more …

What's up next for Kotlin?

What's up next for Kotlin?

Our community is officially one year old! What happened in the last years, where we started from, and what we managed to achieve.
We will start from the beginning to see how a simple idea shaped into a meetup for hundred of developers, providing content and opportunities to learn Kotlin together.

Not only our meetup grew a lot: after Google I/O 2017 Kotlin adoption skyrocketed. There's probably never been a better moment for the Kotlin ecosystem, and the language is getting ready to become the "write once, run everywhere" solution.
Let's walk through some of the features of the upcoming Kotlin release (1.3), to see what the Kotlin future might look like.

by Nicola Corti
presented on August 8, 2018 @yelp

Kotlin User Group Hamburg

August 08, 2018
Tweet

More Decks by Kotlin User Group Hamburg

Other Decks in Programming

Transcript

  1. HH

  2. Speakers • Gesh Markov • Christophe Beyls • Niklas Baudy

    • Cord Jastram • Yahya Bayramoglu • Jossi Wolf • Jendrik Johannes • Ivan Morgillo • Jule Lehmann • Dmitry Zaytsev Lovis Möller - Nicola Corti
  3. Stats • 7 Meetups organized in the last year •

    ~280 total attendees • 333 Meetup Members • 128 Twitter Followers • Basically always booked out!
  4. Reasons for returning to Java Over a quarter of respondents

    who migrated Java to Kotlin needed to revert.
  5. 1.3

  6. 1.3-M1 EAP plugins { kotlin("jvm") version "1.2.60" } repositories {

    mavenCentral() } dependencies { compile(kotlin("stdlib-jdk8", "1.2.60")) }
  7. 1.3-M1 EAP plugins { kotlin("jvm") version "1.2.60" } repositories {

    mavenCentral() maven("http://dl.bintray.com/kotlin/kotlin-eap") } dependencies { compile(kotlin("stdlib-jdk8", "1.2.60")) }
  8. 1.3-M1 EAP plugins { kotlin("jvm") version "1.3-M1" } repositories {

    mavenCentral() maven("http://dl.bintray.com/kotlin/kotlin-eap") } dependencies { compile(kotlin("stdlib-jdk8", "1.3-M1")) }
  9. 1.3-M1 EAP plugins { kotlin("jvm") version "1.3-M1" } repositories {

    mavenCentral() maven("http://dl.bintray.com/kotlin/kotlin-eap") } dependencies { compile(kotlin("stdlib-jdk8", “1.3-M1")) compile(“org.jetbrains.kotlinx:kotlinx-coroutines-core:0.24.0") }
  10. 1.3-M1 EAP plugins { kotlin("jvm") version "1.3-M1" } repositories {

    mavenCentral() maven("http://dl.bintray.com/kotlin/kotlin-eap") } dependencies { compile(kotlin("stdlib-jdk8", “1.3-M1")) compile(“org.jetbrains.kotlinx:kotlinx-coroutines-core:0.24.0-eap13") }
  11. Capturing When fun Request.getBody() : ResponseBody { val response =

    executeRequest() when (response) { is Authenticator.Success -> response.body is HttpError -> throw HttpException(response.status) } }
  12. Capturing When fun Request.getBody() : ResponseBody { when (val response

    = executeRequest()) { is Authenticator.Success -> response.body is HttpError -> throw HttpException(response.status) } }
  13. Capturing When fun Request.getBody() = when (val response = executeRequest())

    { is Authenticator.Success -> response.body is HttpError -> throw HttpException(response.status) }
  14. Interfaces interface MyPublicApi { companion object { val baseUrl =

    "http://..." fun create(): MyPublicApi = ... } }
  15. Interfaces interface MyPublicApi { companion object { @JvmField val baseUrl

    = "http://..." @JvmStatic fun create(): MyPublicApi = ... } } Java 1.8
  16. Annotations annotation class MyAnnotation(val value: Int) { annotation class SubAnnotation

    companion object { val timestamp = System.currentTimeMillis() } }
  17. Annotations annotation class MyAnnotation(val value: Int) { annotation class SubAnnotation

    companion object { @JvmField val timestamp = System.currentTimeMillis() } }
  18. Arity fun arity22Function(lambda : ( Int, Int, Int, Int, Int,

    Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int) -> Unit) { }
  19. Arity fun arity22Function(lambda : ( Int, Int, Int, Int, Int,

    Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int) -> Unit) { } public final void arity22Function(@NotNull Function22 lambda) { Intrinsics.checkParameterIsNotNull(lambda, "lambda"); }
  20. Arity package kotlin.jvm.functions /** A function that takes 0 arguments.

    */ public interface Function0<out R> : Function<R> { /** Invokes the function. */ public operator fun invoke(): R } /** A function that takes 1 argument. */ public interface Function1<in P1, out R> : Function<R> { /** Invokes the function with the specified argument. */ public operator fun invoke(p1: P1): R } /** A function that takes 2 arguments. */ public interface Function2<in P1, in P2, out R> : Function<R> { /** Invokes the function with the specified arguments. */ public operator fun invoke(p1: P1, p2: P2): R } /** A function that takes 3 arguments. */ public interface Function3<in P1, in P2, in P3, out R> : Function<R> { /** Invokes the function with the specified arguments. */ public operator fun invoke(p1: P1, p2: P2, p3: P3): R } /** A function that takes 4 arguments. */ public interface Function4<in P1, in P2, in P3, in P4, out R> : Function<R> { /** Invokes the function with the specified arguments. */ public operator fun invoke(p1: P1, p2: P2, p3: P3, p4: P4): R } /** A function that takes 5 arguments. */ public interface Function5<in P1, in P2, in P3, in P4, in P5, out R> : Function<R> { /** Invokes the function with the specified arguments. */ public operator fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5): R } /** A function that takes 6 arguments. */ public interface Function6<in P1, in P2, in P3, in P4, in P5, in P6, out R> : Function<R> { /** Invokes the function with the specified arguments. */ public operator fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6): R } /** A function that takes 7 arguments. */ public interface Function7<in P1, in P2, in P3, in P4, in P5, in P6, in P7, out R> : Function<R> { /** Invokes the function with the specified arguments. */ public operator fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7): R } /** A function that takes 8 arguments. */ public interface Function8<in P1, in P2, in P3, in P4, in P5, in P6, in P7, in P8, out R> : Function<R> { /** Invokes the function with the specified arguments. */ public operator fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8): R } /** A function that takes 9 arguments. */ public interface Function9<in P1, in P2, in P3, in P4, in P5, in P6, in P7, in P8, in P9, out R> : Function<R> { /** Invokes the function with the specified arguments. */ public operator fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9): R } /** A function that takes 10 arguments. */ public interface Function10<in P1, in P2, in P3, in P4, in P5, in P6, in P7, in P8, in P9, in P10, out R> : Function<R> { /** Invokes the function with the specified arguments. */ public operator fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10): R } /** A function that takes 11 arguments. */ public interface Function11<in P1, in P2, in P3, in P4, in P5, in P6, in P7, in P8, in P9, in P10, in P11, out R> : Function<R> {
  21. Arity /** A function that takes 8 arguments. */ public

    interface Function8<in P1, in P2, in P3, in P4, in P5, in P6, in P7, in P8, out R> : Function<R> { /** Invokes the function with the specified arguments. */ public operator fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8): R } /** A function that takes 9 arguments. */ public interface Function9<in P1, in P2, in P3, in P4, in P5, in P6, in P7, in P8, in P9, out R> : Function<R> { /** Invokes the function with the specified arguments. */ public operator fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9): R } /** A function that takes 10 arguments. */ public interface Function10<in P1, in P2, in P3, in P4, in P5, in P6, in P7, in P8, in P9, in P10, out R> : Function<R> { /** Invokes the function with the specified arguments. */ public operator fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10): R } /** A function that takes 11 arguments. */ public interface Function11<in P1, in P2, in P3, in P4, in P5, in P6, in P7, in P8, in P9, in P10, in P11, out R> : Function<R> { /** Invokes the function with the specified arguments. */ public operator fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11): R } /** A function that takes 12 arguments. */ public interface Function12<in P1, in P2, in P3, in P4, in P5, in P6, in P7, in P8, in P9, in P10, in P11, in P12, out R> : Function<R> { /** Invokes the function with the specified arguments. */ public operator fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12): R } /** A function that takes 13 arguments. */ public interface Function13<in P1, in P2, in P3, in P4, in P5, in P6, in P7, in P8, in P9, in P10, in P11, in P12, in P13, out R> : Function<R> { /** Invokes the function with the specified arguments. */ public operator fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13): R } /** A function that takes 14 arguments. */ public interface Function14<in P1, in P2, in P3, in P4, in P5, in P6, in P7, in P8, in P9, in P10, in P11, in P12, in P13, in P14, out R> : Function<R> { /** Invokes the function with the specified arguments. */ public operator fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14): R } /** A function that takes 15 arguments. */ public interface Function15<in P1, in P2, in P3, in P4, in P5, in P6, in P7, in P8, in P9, in P10, in P11, in P12, in P13, in P14, in P15, out R> : Function<R> { /** Invokes the function with the specified arguments. */ public operator fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14, p15: P15): R } /** A function that takes 16 arguments. */ public interface Function16<in P1, in P2, in P3, in P4, in P5, in P6, in P7, in P8, in P9, in P10, in P11, in P12, in P13, in P14, in P15, in P16, out R> : Function<R> { /** Invokes the function with the specified arguments. */ public operator fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14, p15: P15, p16: P16): R } /** A function that takes 17 arguments. */ public interface Function17<in P1, in P2, in P3, in P4, in P5, in P6, in P7, in P8, in P9, in P10, in P11, in P12, in P13, in P14, in P15, in P16, in P17, out R> : Function<R> { /** Invokes the function with the specified arguments. */ public operator fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14, p15: P15, p16: P16, p17: P17): R } /** A function that takes 18 arguments. */ public interface Function18<in P1, in P2, in P3, in P4, in P5, in P6, in P7, in P8, in P9, in P10, in P11, in P12, in P13, in P14, in P15, in P16, in P17, in P18, out R> : Function<R> { /** Invokes the function with the specified arguments. */ public operator fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14, p15: P15, p16: P16, p17: P17, p18: P18): R } /** A function that takes 19 arguments. */ public interface Function19<in P1, in P2, in P3, in P4, in P5, in P6, in P7, in P8, in P9, in P10, in P11, in P12, in P13, in P14, in P15, in P16, in P17, in P18, in P19, out R> : Function<R> { /** Invokes the function with the specified arguments. */ public operator fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14, p15: P15, p16: P16, p17: P17, p18: P18, p19: P19): R } /** A function that takes 20 arguments. */ public interface Function20<in P1, in P2, in P3, in P4, in P5, in P6, in P7, in P8, in P9, in P10, in P11, in P12, in P13, in P14, in P15, in P16, in P17, in P18, in P19, in P20, out R> : Function<R> { /** Invokes the function with the specified arguments. */ public operator fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14, p15: P15, p16: P16, p17: P17, p18: P18, p19: P19, p20: P20): R } /** A function that takes 21 arguments. */ public interface Function21<in P1, in P2, in P3, in P4, in P5, in P6, in P7, in P8, in P9, in P10, in P11, in P12, in P13, in P14, in P15, in P16, in P17, in P18, in P19, in P20, in P21, out R> : Function<R> { /** Invokes the function with the specified arguments. */ public operator fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14, p15: P15, p16: P16, p17: P17, p18: P18, p19: P19, p20: P20, p21: P21): R } /** A function that takes 22 arguments. */ public interface Function22<in P1, in P2, in P3, in P4, in P5, in P6, in P7, in P8, in P9, in P10, in P11, in P12, in P13, in P14, in P15, in P16, in P17, in P18, in P19, in P20, in P21, in P22, out R> : Function<R> { /** Invokes the function with the specified arguments. */ public operator fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14, p15: P15, p16: P16, p17: P17, p18: P18, p19: P19, p20: P20, p21: P21, p22: P22): R }
  22. Arity fun arity22Function(lambda : ( Int, Int, Int, Int, Int,

    Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int) -> Unit) { }
  23. Arity fun arity23Function(lambda : ( Int, Int, Int, Int, Int,

    Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int) -> Unit) { }
  24. Arity fun arity23Function(lambda : ( Int, Int, Int, Int, Int,

    Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int) -> Unit) { } public final void arity23Function(@NotNull FunctionN lambda) { Intrinsics.checkParameterIsNotNull(lambda, "lambda"); }
  25. Arity fun arity23Function(lambda : ( Int, Int, Int, Int, Int,

    Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int) -> Unit) { } public final void arity23Function(@NotNull FunctionN lambda) { Intrinsics.checkParameterIsNotNull(lambda, "lambda"); }
  26. Arity @SinceKotlin("1.3") interface FunctionN<out R> : Function<R>, FunctionBase<R> { /**

    * Invokes the function with the specified arguments. * * Must **throw exception** if the length of passed [args] * is not equal to the parameter count returned by [arity]. * * @param args arguments to the function */ operator fun invoke(vararg args: Any?): R /** * Returns the number of arguments that must be passed to * this function. */ override val arity: Int } http://bit.ly/keep-bigarity
  27. Inline Classes inline class Username(val value: String) inline class Password(val

    value: String) val myName = Username("nicola") val myPassword = Password("p4ssw0rd")
  28. Inline Classes inline class Username(val value: String) inline class Password(val

    value: String) val myName = Username("nicola") val myPassword = Password("p4ssw0rd") myName = myPassword
  29. Inline Classes inline class Username(val value: String) inline class Password(val

    value: String) val myName = Username("nicola") val myPassword = Password("p4ssw0rd") myName = myPassword myPassword = myName
  30. Inline Classes inline class Username(val value: String) inline class Password(val

    value: String) val myName = Username("nicola") val myPassword = Password("p4ssw0rd") myName = myPassword myPassword = myName myName = "MyNewName" bit.ly/keep-inlineclasses
  31. Unsigned Types val anUnsignedInteger : UInt val anUnsignedLong : ULong

    val anUnsignedByte : UByte val anUnsignedShort : UShort
  32. Unsigned Types val anUnsignedInteger : UInt = 0xFFFF_FFFFu val anUnsignedLong

    : ULong = 10uL val anUnsignedByte : UByte = 0xFFu val anUnsignedShort : UShort = 0xFFFFu
  33. Experimental Annotations @Experimental(Experimental.Level.WARNING) annotation class MyCoolFeatureExperimental @MyCoolFeatureExperimental fun myExperimentalFunction() {

    // ... } @UseExperimental(MyCoolFeatureExperimental::class) fun myClientCode() { myExperimentalFunction() } bit.ly/keep-experimental
  34. SuccessOrFailure /** * A discriminated union that encapsulates successful outcome

    * with a value of type [T] or a failure with an arbitrary * [Throwable] exception. */ inline class SuccessOrFailure<out T> internal constructor( internal val value: Any? // internal value -- either T or Failure ) { internal class Failure(val exception: Throwable) //... }
  35. SuccessOrFailure /** * A discriminated union that encapsulates successful outcome

    * with a value of type [T] or a failure with an arbitrary * [Throwable] exception. */ inline class SuccessOrFailure<out T> internal constructor( internal val value: Any? // internal value -- either T or Failure ) { internal class Failure(val exception: Throwable) //... }
  36. SuccessOrFailure /** * A discriminated union that encapsulates successful outcome

    * with a value of type [T] or a failure with an arbitrary * [Throwable] exception. */ inline class SuccessOrFailure<out T> internal constructor( internal val value: Any? // internal value -- either T or Failure ) { internal class Failure(val exception: Throwable) //... }
  37. SuccessOrFailure /** * A discriminated union that encapsulates successful outcome

    * with a value of type [T] or a failure with an arbitrary * [Throwable] exception. */ inline class SuccessOrFailure<out T> internal constructor( internal val value: Any? // internal value -- either T or Failure ) { internal class Failure(val exception: Throwable) //... } inline fun <R> runCatching(block: () -> R): SuccessOrFailure<R>
  38. SuccessOrFailure /** * A discriminated union that encapsulates successful outcome

    * with a value of type [T] or a failure with an arbitrary * [Throwable] exception. */ inline class SuccessOrFailure<out T> internal constructor( internal val value: Any? // internal value -- either T or Failure ) { internal class Failure(val exception: Throwable) //... } inline fun <R> runCatching(block: () -> R): SuccessOrFailure<R>
  39. SuccessOrFailure inline fun <R> runCatching(block: () -> R): SuccessOrFailure<R> {

    return try { SuccessOrFailure.success(block()) } catch (e: Throwable) { SuccessOrFailure.failure(e) } }
  40. SuccessOrFailure sealed class FindUserResult { data class Found(val user: User)

    : FindUserResult() data class NotFound(val name: String) : FindUserResult() data class MalformedName(val name: String) : FindUserResult() // other cases that need different business-specific handling code } fun findUserByName(name: String): FindUserResult
  41. SuccessOrFailure - Use Cases fun readFilesCatching(files: List<File>): List<SuccessOrFailure<File>> = files.map

    { runCatching { readFile(it) } } readFilesCatching(listOf("...")).map { }
  42. SuccessOrFailure - Use Cases fun readFilesCatching(files: List<File>): List<SuccessOrFailure<File>> = files.map

    { runCatching { readFile(it) } } readFilesCatching(listOf("...")).map { result -> }
  43. SuccessOrFailure - Use Cases fun readFilesCatching(files: List<File>): List<SuccessOrFailure<File>> = files.map

    { runCatching { readFile(it) } } readFilesCatching(listOf("...")).map { result : SuccessOrFailure<File> -> }
  44. SuccessOrFailure - Use Cases fun readFilesCatching(files: List<File>): List<SuccessOrFailure<File>> = files.map

    { runCatching { readFile(it) } } readFilesCatching(listOf("...")).map { result -> result.mapCatching { formatFile(it) } }
  45. SuccessOrFailure - Use Cases fun readFilesCatching(files: List<File>): List<SuccessOrFailure<File>> = files.map

    { runCatching { readFile(it) } } readFilesCatching(listOf("...")).map { result -> result.mapCatching { formatFile(it) } }
  46. SuccessOrFailure - Use Cases try { val data = doSomething()

    processData(data) } catch(e: Throwable) { showErrorDialog(e) }
  47. SuccessOrFailure - Use Cases try { val data = doSomething()

    processData(data) } catch(e: Throwable) { showErrorDialog(e) } runCatching { doSomething() } .onFailure { showErrorDialog(it) } .onSuccess { processData(it) }
  48. SuccessOrFailure - Use Cases /** * Interface representing a continuation

    after a suspension point that * returns value of type `T`. */ @SinceKotlin("1.3") public interface Continuation<in T> { /** * Context of the coroutine that corresponds to this continuation. */ public val context: CoroutineContext /** * Resumes the execution of the corresponding coroutine passing successful or failed [result] as the * return value of the last suspension point. */ public fun resumeWith(result: SuccessOrFailure<T>) } bit.ly/keep-successorfailure
  49. To infinity… • Collections Literals • SAM Conversion • Truly

    Immutability val list = listOf("1", "2", "3") val list = ["1", "2", "3"] val map = mapOf("1" to 1, "2" to 2, "3" to 3) val map = ["1" = 1, "2" = 2, "3" = 3] interface Function<T> { fun run(data: T) } val myFunction: Function<String> = { println ("data $it”) } class Foo(var v: Int) immutable class Bar(val foo: Foo) // This should fail bit.ly/kotlin-feature-survey