Slide 1

Slide 1 text

Não é feitiçaria, é Kotlin! Novidades da linguagem para profissionais Android! ✨ Walmyr Carvalho Developer + Designer @ Kusudama Google Developer Expert, Android @walmyrcarvalho

Slide 2

Slide 2 text

Olá Belo Horizonte! Meu nome é Walmyr Carvalho, muito prazer! :)

Slide 3

Slide 3 text

Trabalho com desenvolvimento Android há 9 anos e sou um Google Developer Experts de Android no Brasil há 3 anos. Além disso, estou muito próximo da comunidade nacional de Android, sendo organizador do GDG São Paulo, Kotlin Meetup São Paulo e Android Dev BR, a maior comunidade brasileira de Android do mundo, com mais de 5700 pessoas!
 
 Também apoio o empreendedorismo nacional, sendo mentor de Android e mobile no Google Developers Launchpad Accelerator e na ACE Startups.

Slide 4

Slide 4 text

Já ajudei a evoluir produtos mobile para empresas como Loggi, 99, Cielo, CI&T, Hotel Urbano e Globo Esporte, durante mais de 8 anos de carreira como desenvolvedor Android. Fonte: Google Play

Slide 5

Slide 5 text

Nesse ano fundei a Kusudama, um estúdio de design e desenvolvimento de produtos digitais para Android e iOS que tem como objetivo criar soluções que tratem os usuários mobile com respeito.

Slide 6

Slide 6 text

Viva o Kotlin! A melhor novidade que o Android já viu!

Slide 7

Slide 7 text

Pergunta: Quando você começou a trabalhar com Kotlin?

Slide 8

Slide 8 text

Fonte: JetBrains

Slide 9

Slide 9 text

Apesar da linguagem Kotlin ter começado seu desenvolvimento em 2011, a sua versão 1.0 foi lançada há 3 anos e 4 meses atrás, em Fevereiro de 2016!

Slide 10

Slide 10 text

Fonte: Blog - JetBrains

Slide 11

Slide 11 text

Mesmo com o Kotlin hoje sendo uma linguagem que funciona literalmente em qualquer plataforma, ela ganhou maior tração no mobile após o anúncio do Google no I/O ’17 como linguagem oficialmente suportada para o desenvolvimento Android.

Slide 12

Slide 12 text

No content

Slide 13

Slide 13 text

E não é só “achismo", os números realmente demonstram isso:

Slide 14

Slide 14 text

Kotlin Census 2018 Resultado da pesquisa jetbrains.com/research/kotlin-census-2018/ Fonte: JetBrains

Slide 15

Slide 15 text

Fonte: Kotlin Census 2018 Grande parte das pessoas que trabalham com Kotlin hoje estão utilizando a linguagem para o desenvolvimento de aplicações mobile, sejam elas pra Android ou em projetos multiplataforma (iOS).

Slide 16

Slide 16 text

Fonte: Kotlin Census 2018 E, dessas pessoas que trabalham com Kotlin no Android, grande maioria está mirando versões mais altas para desenvolver, o que é bem legal! ❤

Slide 17

Slide 17 text

Resultado: Hoje temos o Kotlin como uma linguagem consolidada no mercado e o Google adotando uma política Kotlin-first dentro do desenvolvimento Android!

Slide 18

Slide 18 text

Fonte: Android Developers, 2019

Slide 19

Slide 19 text

Legal! E como foi a evolução do Kotlin como linguagem, de lá pra cá?

Slide 20

Slide 20 text

Do release 1.0 pra cá, o que rolou? Um breve histórico…⏳

Slide 21

Slide 21 text

A linguagem teve vários releases importantes e atualmente está na versão 1.3.40.

Slide 22

Slide 22 text

De lá pra cá muitos recursos foram introduzidos na linguagem para quem trabalha com Android! Vamos ver alguns exemplos disso?

Slide 23

Slide 23 text

Contracts ⚠ Coroutines Data classes Type aliases Sealed classes lateinit Capturar de variáveis no when Inline classes ⚠ onEach() Map.toMap(), Map.toImutableMap() lateinit.isInitialized() Inferência de tipo para Property _ para parâmetros não usados Destructuring @Experimental ⚠ groupingBy() Unsigned types ⚠ also(), takeIf(), takeUnless() @JvmStatic + @JvmField em companion objects Declarações aninhadas em annotations Cópia de elementos entre arrays _ em números literais fill(), replaceAll(), shuffle(), shuffled() Arrays literais em annotations

Slide 24

Slide 24 text

Data classes Type aliases Sealed classes onEach() Map.toMap(), Map.toImutableMap() _ para parâmetros não usados Destructuring groupingBy() also(), takeIf(), takeUnless() @JvmStatic + @JvmField em companion objects _ em números literais Contracts ⚠ Coroutines Capturar de variáveis no when Inline classes ⚠ @Experimental ⚠ Unsigned types ⚠ Declarações aninhadas em annotations Cópia de elementos entre arrays lateinit lateinit.isInitialized() Inferência de tipo para Property Arrays literais em annotations fill(), replaceAll(), shuffle(), shuffled() 1.2.* 1.1.* 1.3.*

Slide 25

Slide 25 text

Importante lembrar que os releases trouxeram muitas melhorias para outras plataformas e projetos, como JavaScript, JVM, nativo e multiplataforma. ✨ Mais detalhes aqui: kotlinlang.org/docs/reference/

Slide 26

Slide 26 text

Kotlin 1.3, o que temos de novo?

Slide 27

Slide 27 text

val response = api.getResponse() return when(response) { is Success -> response.body is HttpError -> HttpException(response.status) } Captura de variáveis dentro do when

Slide 28

Slide 28 text

Captura de variáveis dentro do when val response = api.getResponse() return when(response) { is Success -> response.body is HttpError -> HttpException(response.status) } return when(val response = api.getResponse()) { is Success -> response.body is HttpError -> HttpException(response.status) }

Slide 29

Slide 29 text

Annotations @Experimental ⚠ @Experimental annotation class NewApi // Tag experimental stuff with @NewApi @NewApi class AuthApi { // Put your services here } // Required @NewApi fun loginUser(api: AuthApi) { api.requestLogin() }

Slide 30

Slide 30 text

Annotations @Experimental ⚠ // Manual propagation is not needed @UseExperimental(NewApi::class) fun useNewApi() { NewApi().requestLogin() } @Experimental annotation class NewApi // Tag experimental stuff with @NewApi @NewApi class AuthApi { // Put your services here } // Required @NewApi fun loginUser(api: AuthApi) { api.requestLogin() }

Slide 31

Slide 31 text

Annotations @Experimental ⚠ // Options: Experimental.Level.WARNING or ERROR) @Experimental(level = Experimental.Level.WARNING) annotation class NewApi // Tag experimental stuff with @NewApi @NewApi class AuthApi { // Put your services here } // Required @NewApi fun loginUser(api: AuthApi) { api.requestLogin() }

Slide 32

Slide 32 text

Inline classes ⚠ inline class Name(val s: String) // This is optimized and pressure on compiler and GC is smaller val name = Name("Kotlin") println(name.s)

Slide 33

Slide 33 text

Contracts ⚠ fun checkName(name: String?) { if (name != null) name.length // Compiler automatically casts 's' to 'String' } fun String?.isNotNull(): Boolean = this != null

Slide 34

Slide 34 text

Contracts ⚠ fun checkName(name: String?) { if (name != null) name.length // Compiler automatically casts 's' to 'String' } fun String?.isNotNull(): Boolean = this != null fun checkName(name: String?) { if (name.isNotNull()) name.length // No smartcast :( }

Slide 35

Slide 35 text

Contracts ⚠ fun require(condition: Boolean) { // This is a syntax form, which tells compiler: // "if this function returns successfully, then 'condition' is true" contract { returns() implies condition } if (!condition) throw IllegalArgumentException(...) } fun checkName(name: String?) { require(name is String) // name is smartcasted to 'String' here // because otherwise // 'require’ would have throw an exception }

Slide 36

Slide 36 text

Unsigned integers ⚠ // Using literal suffixes val uint = 42u val ulong = 42uL val ubyte: UByte = 255u // Converting signed types to unsigned and // vice versa via extensions val int = uint.toInt() val byte = ubyte.toByte() val ulong2 = byte.toULong() // Unsigned types support similar operators: val x = 20u + 22u val y = 1u shl 8 val z = "128".toUByte() val range = 1u..5u

Slide 37

Slide 37 text

@JvmStatic + @JvmField em companions objects dentro de interfaces // Kotlin interface Foo { companion object { @JvmField val answer: Int = 42 @JvmStatic fun sayHello() { println("Hello, world!") } } }

Slide 38

Slide 38 text

@JvmStatic + @JvmField em interface companions // Kotlin interface Foo { companion object { @JvmField val answer: Int = 42 @JvmStatic fun sayHello() { println("Hello, world!") } } } // Java interface Foo { public static int answer = 42; public static void sayHello() { // ... } }

Slide 39

Slide 39 text

Annotation classes aninhadas annotation class Navigator { enum class Direction { UP, DOWN, LEFT, RIGHT } annotation class Position companion object { fun lat(): Int = 42 val lng: Int = 42 } }

Slide 40

Slide 40 text

Standard library: copyInto() val sourceArr = arrayOf("k", "o", "t", "l", "i", "n") val targetArr = sourceArr.copyInto( arrayOfNulls(6), 3, startIndex = 3, endIndex = 6) println(targetArr.contentToString()) // [null, null, null, l, i, n] sourceArr.copyInto(targetArr, startIndex = 0, endIndex = 3) println(targetArr.contentToString()) // [k, o, t, l, i, n]

Slide 41

Slide 41 text

Standard library: ifEmpty(), ifBlank() fun printAllUppercase(data: List) { val result = data .filter { it.all { c -> c.isUpperCase() } } .ifEmpty { listOf(“#No uppercase!#”) } result.forEach { println(it) } } printAllUppercase(listOf("hey", "jude")) // #No uppercase!# printAllUppercase(listOf("HEY", "JUDE")) // FOO BAR

Slide 42

Slide 42 text

Standard library: ifEmpty(), ifBlank() fun printAllUppercase(data: List) { val result = data .filter { it.all { c -> c.isUpperCase() } } .ifEmpty { listOf(“#No uppercase!#”) } result.forEach { println(it) } } printAllUppercase(listOf("hey", "jude")) // #No uppercase!# printAllUppercase(listOf("HEY", "JUDE")) // FOO BAR val name = " \n" println(name.ifBlank { “#blank#” }) println(name.ifBlank { null })

Slide 43

Slide 43 text

Standard library: associateWith() val keys = 'a'..'c' val map = keys.associateWith { it.toString().repeat(3).capitalize() } map.forEach { println(it) } // Output: // a=Aaa // b=Bbb // c=Ccc

Slide 44

Slide 44 text

E as tão famosas coroutines?

Slide 45

Slide 45 text

Aplicações assíncronas no Android com Coroutines e JetPack Nelson Glauber, Mobile Developer @ Mokriya Google Developer Expert, Android Com sorteio de licenças do Android Studio!

Slide 46

Slide 46 text

Se eu quiser aprender mais, onde eu posso encontrar material?

Slide 47

Slide 47 text

Kotlin - JetBrains Página oficial kotlinlang.org Fonte: JetBrains

Slide 48

Slide 48 text

Kotlin - Android Developers Página oficial developers.android.com/kotlin Fonte: Android Developers

Slide 49

Slide 49 text

KEEP - Kotlin Evolution and Enhancement Process (GitHub) Repositório de propostas para a evolução da linguagem github.com/kotlin/KEEP

Slide 50

Slide 50 text

Kotlin/Everywhere Evento Global kotl.in/everywhere Fonte: JetBrains Blog

Slide 51

Slide 51 text

Android Dev BR Maior comunidade lusófona de Android no Slack, com mais de 5.700 membros! .❤✨ androiddevbr.org

Slide 52

Slide 52 text

Tenho alguns stickers do ADBR! Me conta mais o que cê tem feito com Kotlin para ganhar um! :)

Slide 53

Slide 53 text

Perguntas? Ficou alguma dúvida?

Slide 54

Slide 54 text

Muito obrigado! Se tiver qualquer dúvida ou sugestão, pode falar comigo. ❤ @walmyrcarvalho /walmyrcarvalho [email protected]