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

AndKotlin

 AndKotlin

Introductory talk on how to use Kotlin to enhance your Android Development

Sérgio Marques Moura

March 22, 2016
Tweet

More Decks by Sérgio Marques Moura

Other Decks in Technology

Transcript

  1. fun  main(args:  Array<String>)  {
        var  language  =

     "Kotlin"
        println("Hello  $language!")
 }  
  2. fun  main(args:  Array<String>)  {
        var  language  =

     "Kotlin"
        println("Hello  $language!")
 }   variable declaration
  3. fun  main(args:  Array<String>)  {
        var  language  =

     "Kotlin"
        println("Hello  $language!")
 }   String interpolation
  4. fun  main(args:  Array<String>)  {
        val  language  =

     "Kotlin"
        if  (args[0].isNotEmpty())  {
                language  =  args[0]
        }
        println("Hello,  $language!")
 }   Constant declaration
  5. fun  main(args:  Array<String>)  {
        val  language  =

     "Kotlin"
        if  (args.isNotEmpty())  {
                language  =  args[0]
        }
        println("Hello,  $language!")
 }  
  6. fun  main(args:  Array<String>)  {
        val  language  =

     "Kotlin"
        if  (args.isNotEmpty())  {
                language  =  args[0]
        }
        println("Hello,  $language!")
 }   Can’t reassign it
  7. fun  main(args:  Array<String>)  {
        val  language  =

     if(args.isNotEmpty())  {
                args[0]
        }  else  {
                "Kotlin"
        }
        println("Hello,  $language!")
 }  
  8. fun  main(args:  Array<String>)  {
        val  language  =

     if(args.isNotEmpty())  {  args[0]  }  else  {  “Kotlin"  }
        println("Hello,  $language!")
 }  
  9. fun  main(args:  Array<String>)  {
        val  language  =

     if(args.isNotEmpty())  args[0]  else  “Kotlin"
        println("Hello,  $language!")
 }  
  10. class  User(firstName:  String,  lastName:  String)  {
        var

     firstName:  String  =  //  ...
        var  lastName:  String  =  //  ...
        
        init  {
                this.firstName  =  firstName
                this.lastName  =  lastName
        }
 }

  11. class  User(firstName:  String,  lastName:  String)  {
        var

     firstName:  String  =  //  ...
        var  lastName:  String  =  //  ...
        
        init  {
                this.firstName  =  firstName
                this.lastName  =  lastName
        }
 }
 Primary Constructor
  12. class  User(firstName:  String,  lastName:  String)  {
        var

     firstName:  String  =  //  ...
        var  lastName:  String  =  //  ...
        
        init  {
                this.firstName  =  firstName
                this.lastName  =  lastName
        }
 }
 val  user  =  User("André",  "Coelho")
 
 Setter user.firstName  =  "Zé"   Getter println(user.firstName)
 >  Zé
  13. class  User(val  firstName:  String,  var  lastName:  String)  
 Final class

    member Non-final class member class  User(firstName:  String,  lastName:  String)  {
        var  firstName:  String  =  //  ...
        var  lastName:  String  =  //  ...
        
        init  {
                this.firstName  =  firstName
                this.lastName  =  lastName
        }
 }

  14. enum  class  Language(val  greeting:  String)  {
        PT("Olá"),

     ES("Hola"),  FR(“Bonjour”),  EN("Hello")
 }  
  15. class  User(val  firstName:  String,  var  lastName:  String,  var  language:  Language?)


    enum  class  Language(val  greeting:  String)  {
        PT("Olá"),  ES("Hola"),  FR(“Bonjour”),  EN("Hello")
 }  
  16. class  User(val  firstName:  String,  var  lastName:  String,  var  language:  Language?)


    enum  class  Language(val  greeting:  String)  {
        PT("Olá"),  ES("Hola"),  FR(“Bonjour”),  EN("Hello")
 }   Non null type
  17. class  User(val  firstName:  String,  var  lastName:  String,  var  language:  Language?)


    enum  class  Language(val  greeting:  String)  {
        PT("Olá"),  ES("Hola"),  FR(“Bonjour”),  EN("Hello")
 }   Nullable-type
  18. class  User(val  firstName:  String,  var  lastName:  String,  var  language:  Language?)


    enum  class  Language(val  greeting:  String)  {
        PT("Olá"),  ES("Hola"),  FR(“Bonjour”),  EN(“Hello”)
 }   fun  main(args:  Array<String>)  {
        val  user  =  User("João",  "Andrade",  Language.PT)
 }  
  19. class  User(val  firstName:  String,  var  lastName:  String,  var  language:  Language?)


    enum  class  Language(val  greeting:  String)  {
        PT("Olá"),  ES("Hola"),  FR(“Bonjour”),  EN(“Hello”)
 }   fun  main(args:  Array<String>)  {
        val  user  =  User("João",  "Andrade",  null)
 }  
  20. class  User(val  firstName:  String,  var  lastName:  String,  var  language:  Language?)


    enum  class  Language(val  greeting:  String)  {
        PT("Olá"),  ES("Hola"),  FR(“Bonjour”),  EN(“Hello”)
 }   fun  main(args:  Array<String>)  {
        val  user  =  User("João",  "Andrade",  null)
        val  greeting  =  user.language.greeting
 }   Unsafe call
  21. class  User(val  firstName:  String,  var  lastName:  String,  var  language:  Language?)


    enum  class  Language(val  greeting:  String)  {
        PT("Olá"),  ES("Hola"),  FR(“Bonjour”),  EN(“Hello”)
 }   fun  main(args:  Array<String>)  {
        val  user  =  User("João",  "Andrade",  null)
        val  greeting  =  user.language?.greeting            println(greeting)   }  
  22. class  User(val  firstName:  String,  var  lastName:  String,  var  language:  Language?)


    enum  class  Language(val  greeting:  String)  {
        PT("Olá"),  ES("Hola"),  FR(“Bonjour”),  EN(“Hello”)
 }   fun  main(args:  Array<String>)  {
        val  user  =  User("João",  "Andrade",  null)
        val  greeting  =  user.language?.greeting            println(greeting)   }   >  null
  23. class  User(val  firstName:  String,  var  lastName:  String,  var  language:  Language?)


    enum  class  Language(val  greeting:  String)  {
        PT("Olá"),  ES("Hola"),  FR(“Bonjour”),  EN(“Hello”)
 }   fun  main(args:  Array<String>)  {
        val  user  =  User("João",  "Andrade",  null)
        val  greeting  =  user.language?.greeting  ?:  Language.EN.greeting
        println(greeting)
 }   Elvis Operator
  24. class  User(val  firstName:  String,  var  lastName:  String,  var  language:  Language?)


    enum  class  Language(val  greeting:  String)  {
        PT("Olá"),  ES("Hola"),  FR(“Bonjour”),  EN(“Hello”)
 }   fun  main(args:  Array<String>)  {
        val  user  =  User("João",  "Andrade",  null)
        val  greeting  =  user.language?.greeting  ?:  Language.EN.greeting
        println(greeting)
 }   Elvis Operator >  Hello
  25. enum  class  Language(val  greeting:  String)  {
        PT("Olá"),

     ES("Hola"),  FR(“Bonjour”),  EN(“Hello”)
 }   class  User(val  firstName:  String,  
                      var  lastName:  String,  
                      var  language:  Language  =  Language.EN)   Default value
  26. enum  class  Language(val  greeting:  String)  {
        PT("Olá"),

     ES("Hola"),  FR(“Bonjour”),  EN(“Hello”)
 }   class  User(val  firstName:  String,  
                      var  lastName:  String,  
                      var  language:  Language  =  Language.EN)   fun  main(args:  Array<String>)  {
        val  user  =  User("João",  "Andrade")
        val  greeting  =  user.language.greeting
        println(greeting)
 }   >  Hello
  27. public  class  User  {
        
    

       private  String  mName;
        private  int  mAge;
        
        public  User(String  name,  int  age)  {
                mName  =  name;
                mAge  =  age;
        }
        
        public  void  setAge(int  age)  {
                mAge  =  age;
        }
        
        public  void  setName(String  name)  {
                mName  =  name;
        }
        
        public  int  getAge()  {
                return  mAge;
        }
        
        public  String  getName()  {
                return  mName
        }
           @Override
 public  String  toString()  {
        return  mName  +  ";"  +  mAge;
 }   }   Java data  class  User(name:  String,  age:  Int)
 • equals()  and  hashCode()   • copy()   • toString() val  user  =  User("António",  32)
 println(user)   Kotlin >  User(name=António,  age=36)
  28. val  sum:  (Int,  Int)  -­‐>  Int  =  {  x,  y

     -­‐>  x  +  y  }
 val  result  =  sum(5,  4)  
  29. val  sum:  (Int,  Int)  -­‐>  Int  =  {  x,  y

     -­‐>  x  +  y  }
 val  sum  =  {  x:  Int,  y:  Int  -­‐>  x  +  y  }
 val  result  =  sum(5,  4)  
  30. val  double:  (Int)  -­‐>  Int  =  {  x  -­‐>  x

     *  2  }
 val  result  =  double(3)  
  31. val  double:  (Int)  -­‐>  Int  =  {  it  *  2

     }
 val  result  =  double(3)   Inferred parameter
  32. fun  <T>  filter(items:  Collection<T>,  predicate:  (T)  -­‐>  Boolean):  List<T>  {


           var  filtered  =  ArrayList<T>()
        for  (item  in  items)  if  (predicate(item))  filtered.add(item)
        return  filtered
 }  
  33. fun  <T>  filter(items:  Collection<T>,  predicate:  (T)  -­‐>  Boolean):  List<T>  {


           var  filtered  =  ArrayList<T>()
        for  (item  in  items)  if  (predicate(item))  filtered.add(item)
        return  filtered
 }   function as parameter
  34. fun  <T>  filter(items:  Collection<T>,  predicate:  (T)  -­‐>  Boolean):  List<T>  {


           var  filtered  =  ArrayList<T>()
        for  (item  in  items)  if  (predicate(item))  filtered.add(item)
        return  filtered
 }   function invocation
  35. fun  <T>  filter(items:  Collection<T>,  predicate:  (T)  -­‐>  Boolean):  List<T>  {


           var  filtered  =  ArrayList<T>()
        for  (item  in  items)  if  (predicate(item))  filtered.add(item)
        return  filtered
 }   val  portugueseSpeaker  =  User("João",  "Andrade",  Language.PT)
 val  frenchSpeak  =  User("Jean",  "Andrade",  Language.FR)
 val  englishSpeaker  =  User("John",  "Andrade",  Language.EN)
 
 val  speakers  =  listOf(portugueseSpeaker,  frenchSpeak,  englishSpeaker)

  36. fun  <T>  filter(items:  Collection<T>,  predicate:  (T)  -­‐>  Boolean):  List<T>  {


           var  filtered  =  ArrayList<T>()
        for  (item  in  items)  if  (predicate(item))  filtered.add(item)
        return  filtered
 }   val  portugueseSpeaker  =  User("João",  "Andrade",  Language.PT)
 val  frenchSpeak  =  User("Jean",  "Andrade",  Language.FR)
 val  englishSpeaker  =  User("John",  "Andrade",  Language.EN)
 
 val  speakers  =  listOf(portugueseSpeaker,  frenchSpeak,  englishSpeaker)
 filter(speakers,  {  speaker  -­‐>  speaker.language  ==  Language.PT  })

  37. fun  <T>  filter(items:  Collection<T>,  predicate:  (T)  -­‐>  Boolean):  List<T>  {


           var  filtered  =  ArrayList<T>()
        for  (item  in  items)  if  (predicate(item))  filtered.add(item)
        return  filtered
 }   val  portugueseSpeaker  =  User("João",  "Andrade",  Language.PT)
 val  frenchSpeak  =  User("Jean",  "Andrade",  Language.FR)
 val  englishSpeaker  =  User("John",  "Andrade",  Language.EN)
 
 val  speakers  =  listOf(portugueseSpeaker,  frenchSpeak,  englishSpeaker)
 filter(speakers)  {  speaker  -­‐>  speaker.language  ==  Language.PT  }

  38. fun  <T>  filter(items:  Collection<T>,  predicate:  (T)  -­‐>  Boolean):  List<T>  {


           var  filtered  =  ArrayList<T>()
        for  (item  in  items)  if  (predicate(item))  filtered.add(item)
        return  filtered
 }   val  portugueseSpeaker  =  User("João",  "Andrade",  Language.PT)
 val  frenchSpeak  =  User("Jean",  "Andrade",  Language.FR)
 val  englishSpeaker  =  User("John",  "Andrade",  Language.EN)
 
 val  speakers  =  listOf(portugueseSpeaker,  frenchSpeak,  englishSpeaker)
 filter(speakers)  {  it.language  ==  Language.PT  }

  39. public  static  void  snack(View  view,  String  string,  int  duration)  {


           Snackbar  snackbar  =  Snackbar.make(view,  string,  duration);
        snackbar.show();
 }  
  40. public  static  void  snack(View  view,  String  string,  int  duration)  {


           Snackbar  snackbar  =  Snackbar.make(view,  string,  duration);
        snackbar.show();
 }   fun  snack(view:  View,  msg:  String,  duration:  Int)  {
        val  snack  =  Snackbar.make(view,  msg,  duration)
        snack.show()
 }  
  41. public  static  void  snack(View  view,  String  string,  int  duration)  {


           Snackbar  snackbar  =  Snackbar.make(view,  string,  duration);
        snackbar.show();
 }   fun  View.snack(msg:  String,  duration:  Int)  {
        val  snack  =  Snackbar.make(view,  msg,  duration)
        snack.show()
 }  
  42. public  static  void  snack(View  view,  String  string,  int  duration)  {


           Snackbar  snackbar  =  Snackbar.make(view,  string,  duration);
        snackbar.show();
 }   fun  View.snack(msg:  String,  duration:  Int)  {
        val  snack  =  Snackbar.make(        ,  msg,  duration)
        snack.show()
 }   this view The “View” object
  43. public  static  void  snack(View  view,  String  string,  int  duration)  {


           Snackbar  snackbar  =  Snackbar.make(view,  string,  duration);
        snackbar.show();
 }   fun  View.snack(msg:  String,  duration:  Int)  {
        val  snack  =  Snackbar.make(        ,  msg,  duration)
        snack.show()
 }   view fun  showSnackAlert()  {
        coordinatorLayout.snack("An  error  occurred!")
 }  
  44. val  realm  =  Realm.getDefaultInstance()
 val  userAccount  =  UserAccount(12345L,  "[email protected]",  true)


    
 realm.beginTransaction()
 realm.copyToRealmOrUpdate(userAccount)
 realm.commitTransaction()  
  45. fun  Realm.inTransaction(func:  ()  -­‐>  Unit)  {
        beginTransaction()


           func()
        commitTransaction()
 }   val  realm  =  Realm.getDefaultInstance()
 val  userAccount  =  UserAccount(12345L,  "[email protected]",  true)
 
 realm.inTransaction  {  
 }  
  46. fun  Realm.inTransaction(func:  ()  -­‐>  Unit)  {
        beginTransaction()


           func()
        commitTransaction()
 }   val  realm  =  Realm.getDefaultInstance()
 val  userAccount  =  UserAccount(12345L,  "[email protected]",  true)
 
 realm.inTransaction  {            realm.copyToRealmOrUpdate(userAccount)
 }  
  47. fun  Realm.inTransaction(func:  ()  -­‐>  Unit  )  {
      

     beginTransaction()
        func()
        commitTransaction()
 }  
  48. fun  Realm.inTransaction(func:  (Realm)  -­‐>  Unit  )  {
      

     beginTransaction()
        func()
        commitTransaction()
 }  
  49. fun  Realm.inTransaction(func:  (Realm)  -­‐>  Unit  )  {
      

     beginTransaction()
        func()
        commitTransaction()
 }  
  50. fun  Realm.inTransaction(func:  (Realm)  -­‐>  Unit  )  {
      

     beginTransaction()
        func(this)
        commitTransaction()
 }  
  51. fun  Realm.inTransaction(func:  (Realm)  -­‐>  Unit  )  {
      

     beginTransaction()
        func(this)
        commitTransaction()
 }   val  realm  =  Realm.getDefaultInstance()
 val  userAccount  =  UserAccount(12345L,  "[email protected]",  true)
 
 realm.inTransaction  {  
        realm.copyToRealmOrUpdate(userAccount)
 }  
  52. fun  Realm.inTransaction(func:  (Realm)  -­‐>  Unit  )  {
      

     beginTransaction()
        func(this)
        commitTransaction()
 }   val  realm  =  Realm.getDefaultInstance()
 val  userAccount  =  UserAccount(12345L,  "[email protected]",  true)
 
 realm.inTransaction  {  
        it.copyToRealmOrUpdate(userAccount)
 }  
  53. fun  Realm.inTransaction(func:  (Realm)  -­‐>  Unit  )  {
      

     beginTransaction()
        func(this)
        commitTransaction()
 }   val  realm  =  Realm.getDefaultInstance()
 val  userAccount  =  UserAccount(12345L,  "[email protected]",  true)
 
 realm.inTransaction  {  
        it.copyToRealmOrUpdate(userAccount)
 }  
  54. fun  Realm.inTransaction(func:  (Realm)  -­‐>  Unit  )  {
      

     beginTransaction()
        func(this)
        commitTransaction()
 }  
  55. fun  Realm.inTransaction(func:  Realm.()  -­‐>  Unit  )  {
      

     beginTransaction()
        func(this)
        commitTransaction()
 }  
  56. fun  Realm.inTransaction(func:  Realm.()  -­‐>  Unit  )  {
      

     beginTransaction()
        func(this)
        commitTransaction()
 }  
  57. fun  Realm.inTransaction(func:  Realm.()  -­‐>  Unit  )  {
      

     beginTransaction()
        this.func()
        commitTransaction()
 }  
  58. fun  Realm.inTransaction(func:  Realm.()  -­‐>  Unit  )  {
      

     beginTransaction()
        this.func()
        commitTransaction()
 }   val  realm  =  Realm.getDefaultInstance()
 val  userAccount  =  UserAccount(12345L,  "[email protected]",  true)
 
 realm.inTransaction  {  
        it.copyToRealmOrUpdate(userAccount)
 }  
  59. fun  Realm.inTransaction(func:  Realm.()  -­‐>  Unit  )  {
      

     beginTransaction()
        this.func()
        commitTransaction()
 }   val  realm  =  Realm.getDefaultInstance()
 val  userAccount  =  UserAccount(12345L,  "[email protected]",  true)
 
 realm.inTransaction  {  
        copyToRealmOrUpdate(userAccount)
 }  
  60. public class ExampleActivity extends Activity {
 
 private Button mButton;


    
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.main_activity);
 
 mButton = (Button) findViewById(R.id.button);
 
 if(mButton != null) {
 mButton.setOnClickListener(new View.OnClickListener() {
 @Override
 public void onClick(View v) {
 Toast.makeText(ExampleActivity.this, "Hello!", Toast.LENGTH_SHORT).show();
 }
 });
 }
 }
 } Java class ExampleActivity : Activity() {
 
 override fun onCreate(savedInstanceState: Bundle?) {
 super.onCreate(savedInstanceState)
 setContentView(R.layout.main_activity)
 button.onClick { toast("Hello!") }
 }
 } Kotlin
  61. class ExampleActivity : Activity() {
 
 var cachedView: HashMap<Int, View>?

    
 
 fun getCachedViewById(id: Int): View 
 
 override fun onCreate(savedInstanceState: Bundle?) {
 super.onCreate(savedInstanceState)
 var button = getCachedViewById(R.id.button) as Button
 button.onClick { toast("Hello") }
 }
 }
  62. public  void  setupTextView(TextView  textView)  {
        textView.setTextColor(R.color.black);
  

         textView.setTextSize(16f);
        textView.setText("So  repetitive!");
        textView.setAlpha(0.8f);
 }   Java fun  setupTextView(textView:  TextView)  {
        with(textView)  {
                textColor  =  R.color.black
                textSize  =  16f
                alpha  =  0.8f
                text  =  "Not  anymore!"
        }
 }   Kotlin
  63. public  void  setupTextView()  {          TextView  textView

     =  new  TextView(context)
        textView.setTextColor(R.color.blue);
        textView.setTextSize(16f);
        textView.setText("So  repetitive!");
        textView.setAlpha(0.8f);
 }     Java Kotlin val  textView  =  TextView(context).apply  {
        textColor  =  R.color.blue          textSize  =  16f
        alpha  =  0.8f          text  =  "Not  anymore!"
 }