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

Kotlin & Android, Java é opcional

Kotlin & Android, Java é opcional

Talk given at Android MeetUp (in pt-BR), organised by GDG São Paulo, about how Kotlin can be beneficial to Android developers if you either decides to keep both Java and Kotlin or even write your app entirely in Kotlin.

Filipe Guedes

July 05, 2016
Tweet

More Decks by Filipe Guedes

Other Decks in Technology

Transcript

  1. Kotlin Anunciado em 2011 pela JetBrains criada pra suprir uma

    necessidade de features em linguagens encontrada até então apenas no Scala. • Pragmática • Sintaxe concisa • Compila para bytecode • Roda em cima da JVM • 100% "two-way" interoperável com Java • Open-source • Estável desde Fevereiro de 2016
  2. Kotlin e a 99 Tudo começou em Novembro de 2015,

    quando o primeiro beta do 1.0 foi anunciado. Fizemos experimentos, testes, validações de viabilidade e projetos pessoais. O time gostou da experiência, obtivemos bons resultados e com o "apoio" de alguns nomes grandes que também o estão usando decidimos que valia a pena adota-lo como nossa linguagem principal. Hoje temos codebase em Kotlin de 20% no app de passageiro e 16% no app de motorista.
  3. class Foo {
 
 fun sum(a: Int, b: Int): Int

    {
 return a + b
 }
 
 fun printSum(a: Int, b: Int): Unit {
 print(a + b)
 }
 
 }
  4. class Foo {
 
 fun sum(a: Int, b: Int) =

    a + b
 
 fun printSum(a: Int, b: Int): Unit {
 print(a + b)
 }
 
 }
  5. class Foo {
 
 fun sum(a: Int, b: Int) =

    a + b
 
 fun printSum(a: Int, b: Int) {
 print(a + b)
 }
 
 }
  6. val a: Int = 1
 
 val b = 1


    
 var c = "Any variable"
 
 val d = Foo()
  7. Interoperabilidade Properties class Foo {
 var bar = "Bar"
 }

    val foo = Foo()
 
 print(foo.bar)
 foo.bar = "another"
  8. Interoperabilidade Properties class Foo {
 var bar = "Bar" get()

    = "Foo -> $field"
 } 
 
 print(foo.bar)

  9. Interoperabilidade Properties class Foo {
 var bar = "Bar" get()

    = "Foo -> $field"
 } foo.bar = "demo" print(foo.bar)

  10. Interoperabilidade Properties class Foo {
 var bar = "Bar" get()

    = "Foo -> $field"
 } foo.bar = "demo" print(foo.bar)
 // prints 'Foo -> demo'
  11. Interoperabilidade Properties class Foo {
 var bar = "Bar" get()

    = "Foo -> $field" private set
 } foo.bar = "demo" // compilation problem
  12. Interoperabilidade Constructors constructor(context: Context) : this(context, null)
 
 constructor(context: Context,

    attrs: AttributeSet?) : this(context, attrs, 0)
 
 constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int)
 : super(context, attrs, defStyleAttr) {
 // some stuff
 }
  13. Interoperabilidade Constructors constructor(context: Context) : this(context, null)
 
 constructor(context: Context,

    attrs: AttributeSet?) : this(context, attrs, 0)
 
 constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int)
 : super(context, attrs, defStyleAttr) {
 // some stuff
 } @JvmOverloads
 constructor(
 context: Context,
 attrs: AttributeSet? = null,
 defStyleAttr: Int = 0
 ) : super(context, attrs, defStyleAttr) {
 // Some stuff
 }
  14. Null Safety var a: String = "abc"
 a = null

    // compilation error
 
 println(a.length)
  15. Null Safety var a: String? = "abc"
 a = null


    
 println(a.length) // compilation error
  16. Null Safety var a: String? = "abc"
 a = null


    
 println(a?.length) // will print 'null'
  17. Null Safety var a: String? = "abc"
 a = null


    
 println(a?.length ?: "Was null") // will print 'Was null'
  18. Null Safety var a: String? = "abc"
 a = null


    
 println(a!!.length) // XGH
  19. Null Safety override fun onCreate(savedState: Bundle?) {
 val userId =

    savedState?.getLong("userId")
 } var myServiceBinder: MyServiceBinder? = null
 myServiceBinder?.foo() setSupportActionBar(toolbar)
 supportActionBar?.setDisplayHomeAsUpEnabled(true)
  20. Null Safety Interoperabilidade // Java public class Foo {
 public

    void bar(String x) {
 
 }
 } val foo = Foo()
 foo.bar(null)
  21. Null Safety Interoperabilidade // Java public class Foo {
 public

    void bar(@NonNull String x) {
 
 }
 } val foo = Foo()
 foo.bar(null)
  22. Null Safety Interoperabilidade // Java public class Foo {
 public

    void bar(@NonNull String x) {
 
 }
 } val foo = Foo()
 foo.bar(null) // compilation problem
  23. Extensions Possibilita extender tipos adicionando novos métodos ou propriedades, removendo

    a necessidade de criação de classes *Util. fun Any.myExtension(): String {
 return "Foo"
 } val Any.myExtensionProperty: Int
 get() = 42
  24. Extensions val <T> List<T>.lastIndex: Int
 get() = size - 1

    val list = listOf("a", "b", "c", "d", "e")

  25. Extensions val <T> List<T>.lastIndex: Int
 get() = size - 1

    val list = listOf("a", "b", "c", "d", "e")
 println(list.lastIndex)
  26. Extensions val <T> List<T>.lastIndex: Int
 get() = size - 1

    val list = listOf("a", "b", "c", "d", "e")
 println(list.lastIndex) // prints '4'
  27. Extensions fun Parcel.readBoolean() = readByte() > 0 
 fun Parcel.writeBoolean(boolean:

    Boolean) {
 when {
 boolean -> writeByte(1)
 else -> writeByte(0)
 }
 }
  28. Extensions fun Parcel.readBoolean() = readByte() > 0 
 fun Parcel.writeBoolean(boolean:

    Boolean) {
 when {
 boolean -> writeByte(1)
 else -> writeByte(0)
 }
 } override fun writeToParcel(parcel: Parcel, p1: Int) {
 parcel.writeBoolean(myBooleanField)
 } myBooleanField = parcel.readBoolean()
  29. Function types são um modo de expressar uma função em

    forma de um tipo para poder, por exemplo, ser associada a um parâmetro ou variável. Lambda são "funções literais anônimas", que não são declaradas mas passadas como uma expressão FunctionTypes e Lambda expressions
  30. FunctionTypes // Java public interface OnClickListener {
 void onClick(View view);


    } public void setOnClickListener(View.OnClickListener l) {
 
 } () -> T
  31. FunctionTypes // Java public interface OnClickListener {
 void onClick(View view);


    } public void setOnClickListener(View.OnClickListener l) {
 
 } view.setOnClickListener(new View.OnClickListener() {
 @Override
 public void onClick(View view) {
 viewClicked();
 }
 }); () -> T
  32. FunctionTypes // Java public interface OnClickListener {
 void onClick(View view);


    } public void setOnClickListener(View.OnClickListener l) {
 
 } view.setOnClickListener((View view) → { viewClicked(); }); () -> T
  33. FunctionTypes // Java public interface OnClickListener {
 void onClick(View view);


    } fun setOnClickListener(View.OnClickListener l) {
 
 } view.setOnClickListener((View view) → { viewClicked(); }); () -> T
  34. FunctionTypes // Java public interface OnClickListener {
 void onClick(View view);


    } fun setOnClickListener(l: (View) -> Unit) {
 
 } view.setOnClickListener((View view) → { viewClicked(); }); () -> T
  35. FunctionTypes 
 
 fun setOnClickListener(l: (View) -> Unit) {
 


    } view.setOnClickListener((View view) → { viewClicked(); }); () -> T
  36. FunctionTypes 
 
 fun setOnClickListener(l: (View) -> Unit) {
 


    } view.setOnClickListener((View view) -> { viewClicked() }) () -> T
  37. FunctionTypes 
 
 fun setOnClickListener(l: (View) -> Unit) {
 


    } view.setOnClickListener({ view: View -> viewClicked() }) () -> T
  38. FunctionTypes 
 
 fun setOnClickListener(l: (View) -> Unit) {
 


    } view.setOnClickListener({ view -> viewClicked() }) () -> T
  39. FunctionTypes 
 
 fun setOnClickListener(l: (View) -> Unit) {
 


    } view.setOnClickListener() { view -> viewClicked() } () -> T
  40. FunctionTypes 
 
 fun setOnClickListener(l: (View) -> Unit) {
 


    } view.setOnClickListener() { viewClicked() } () -> T
  41. FunctionTypes var listener: (View) -> Unit
 
 fun setFooListener(listener: (View)

    -> Unit) {
 this.listener = listener
 } listener?.invoke(view) listener(view)
  42. Extensions & FunctionTypes fun FragmentManager.withTransaction( func: (FragmentTransaction) -> Unit )

    {
 val transaction = beginTransaction()
 func(transaction)
 transaction.commit()
 } supportFragmentManager.withTransaction { transaction ->
 transaction.replace(R.id.my_frame_id, MyFragment())
 }
  43. Kotlin & Android • Kotlin library (1.0.2) → Method count

    5728 • Annotation processing → As vezes se perde e requer `./gradlew clean build` • Android Lint checks → Suportado desde 2016-May-13 (1.0.2)
  44. Kotlin & Android Java é opcional Filipe Guedes twitter.com/fgsguedes github.com/fgsguedes

    Philipe Steiff twitter.com/philipesteiff github.com/philipesteiff