Slide 1

Slide 1 text

andKotlin Fábio Carballo @fabiocarballo Sérgio Moura @sergiomarqmoura

Slide 2

Slide 2 text

import kotlin • Java language restrictions • Android API design problems

Slide 3

Slide 3 text

Statically typed programming language targeting the JVM and JavaScript 100% interoperable with Java(TM)

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

fun  main(args:  Array):  Unit  {
        println("Hello,  Kotlin!")
 }   Function keyword

Slide 6

Slide 6 text

fun  main(args:  Array):  Unit  {
        println("Hello,  Kotlin!")
 }   Function name

Slide 7

Slide 7 text

fun  main(args:  Array):  Unit  {
        println("Hello,  Kotlin!")
 }   Argument name

Slide 8

Slide 8 text

fun  main(args:  Array):  Unit  {
        println(“Hello,  Kotlin!")
 }   Argument type

Slide 9

Slide 9 text

fun  main(args:  Array):  Unit  {
        println(“Hello,  Kotlin!")
 }   Return type

Slide 10

Slide 10 text

fun  main(args:  Array):  Unit  {
        println("Hello,  Kotlin!")
 }  

Slide 11

Slide 11 text

fun  main(args:  Array)  {
        println("Hello,  Kotlin!")
 }  

Slide 12

Slide 12 text

fun  main(args:  Array)  {
        var  language  =  "Kotlin"
        println("Hello  $language!")
 }  

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

fun  main(args:  Array)  {
        var  language  =  "Kotlin"
        println("Hello  $language!")
 }   String interpolation

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

fun  sum(a:  Int,  b:  Int):  Int  {
        return  a  +  b
 }  

Slide 22

Slide 22 text

fun  sum(a:  Int,  b:  Int)  =  a  +  b


Slide 23

Slide 23 text

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


Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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é

Slide 26

Slide 26 text

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
        }
 }


Slide 27

Slide 27 text

enum  class  Language(val  greeting:  String)  {
        PT("Olá"),  ES("Hola"),  FR(“Bonjour”),  EN("Hello")
 }  

Slide 28

Slide 28 text

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")
 }  

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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)  {
        val  user  =  User("João",  "Andrade",  Language.PT)
 }  

Slide 32

Slide 32 text

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)  {
        val  user  =  User("João",  "Andrade",  null)
 }  

Slide 33

Slide 33 text

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)  {
        val  user  =  User("João",  "Andrade",  null)
        val  greeting  =  user.language.greeting
 }   Unsafe call

Slide 34

Slide 34 text

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)  {
        val  user  =  User("João",  "Andrade",  null)
        val  greeting  =  user.language?.greeting            println(greeting)   }  

Slide 35

Slide 35 text

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)  {
        val  user  =  User("João",  "Andrade",  null)
        val  greeting  =  user.language?.greeting            println(greeting)   }   >  null

Slide 36

Slide 36 text

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)  {
        val  user  =  User("João",  "Andrade",  null)
        val  greeting  =  user.language?.greeting  ?:  Language.EN.greeting
        println(greeting)
 }   Elvis Operator

Slide 37

Slide 37 text

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)  {
        val  user  =  User("João",  "Andrade",  null)
        val  greeting  =  user.language?.greeting  ?:  Language.EN.greeting
        println(greeting)
 }   Elvis Operator >  Hello

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

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)  {
        val  user  =  User("João",  "Andrade")
        val  greeting  =  user.language.greeting
        println(greeting)
 }   >  Hello

Slide 40

Slide 40 text

Data Classes

Slide 41

Slide 41 text

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)

Slide 42

Slide 42 text

Lambdas

Slide 43

Slide 43 text

 {  x,  y  -­‐>  x  +  y  }  

Slide 44

Slide 44 text

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

Slide 45

Slide 45 text

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

Slide 46

Slide 46 text

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

Slide 47

Slide 47 text

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

Slide 48

Slide 48 text

High-Order Functions

Slide 49

Slide 49 text

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

Slide 50

Slide 50 text

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

Slide 51

Slide 51 text

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

Slide 52

Slide 52 text

fun    filter(items:  Collection,  predicate:  (T)  -­‐>  Boolean):  List  {
        var  filtered  =  ArrayList()
        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)


Slide 53

Slide 53 text

fun    filter(items:  Collection,  predicate:  (T)  -­‐>  Boolean):  List  {
        var  filtered  =  ArrayList()
        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  })


Slide 54

Slide 54 text

fun    filter(items:  Collection,  predicate:  (T)  -­‐>  Boolean):  List  {
        var  filtered  =  ArrayList()
        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  }


Slide 55

Slide 55 text

fun    filter(items:  Collection,  predicate:  (T)  -­‐>  Boolean):  List  {
        var  filtered  =  ArrayList()
        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  }


Slide 56

Slide 56 text

Extension Functions

Slide 57

Slide 57 text

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

Slide 58

Slide 58 text

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()
 }  

Slide 59

Slide 59 text

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()
 }  

Slide 60

Slide 60 text

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

Slide 61

Slide 61 text

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!")
 }  

Slide 62

Slide 62 text

Putting It All Together

Slide 63

Slide 63 text

val  realm  =  Realm.getDefaultInstance()
 val  userAccount  =  UserAccount(12345L,  "[email protected]",  true)
 
 realm.beginTransaction()
 realm.copyToRealmOrUpdate(userAccount)
 realm.commitTransaction()  

Slide 64

Slide 64 text

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

Slide 65

Slide 65 text

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

Slide 66

Slide 66 text

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

Slide 67

Slide 67 text

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

Slide 68

Slide 68 text

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

Slide 69

Slide 69 text

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

Slide 70

Slide 70 text

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

Slide 71

Slide 71 text

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)
 }  

Slide 72

Slide 72 text

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)
 }  

Slide 73

Slide 73 text

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)
 }  

Slide 74

Slide 74 text

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

Slide 75

Slide 75 text

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

Slide 76

Slide 76 text

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

Slide 77

Slide 77 text

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

Slide 78

Slide 78 text

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)
 }  

Slide 79

Slide 79 text

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)
 }  

Slide 80

Slide 80 text

Kotlin Android Extensions

Slide 81

Slide 81 text

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

Slide 82

Slide 82 text

class ExampleActivity : Activity() {
 
 var cachedView: HashMap? 
 
 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") }
 }
 }

Slide 83

Slide 83 text

Kotlin Perks

Slide 84

Slide 84 text

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

Slide 85

Slide 85 text

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!"
 }  

Slide 86

Slide 86 text

• Website • https://kotlinlang.org • Online IDE • http://try.kotlinlang.org Resources

Slide 87

Slide 87 text

• Are you up for a real challenge? • [email protected] Call for Android Developers