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

Android & Kotlin: The code awakens (episode 01)...

Android & Kotlin: The code awakens (episode 01) - 1/3

Kotlin vs Java - Part 1
Property
String templates
Lambdas
Lazy properties

Avatar for Omar Miatello

Omar Miatello

November 26, 2015
Tweet

More Decks by Omar Miatello

Other Decks in Technology

Transcript

  1. Omar Miatello Member of GDG Milano (Italy) Android Developer @

    Satispay Personal profile google.com/+OmarMiatello Google+ Community: Kotlin for Android goo.gl/mUKF1w Google Presentation #01 goo.gl/0jHLmE #02 goo.gl/h3uG8M #03 goo.gl/hnwvqu Google Photo #01 goo.gl/photos/cKP9L6zqZcxDRGzQ8 #02 goo.gl/photos/sXdpkbihCi5xAAnx7 #03 goo.gl/photos/P6kGhLE8yrWYnhAW6
  2. What is Kotlin? Statically typed programming language for the JVM,

    Android and the browser. (http://kotlinlang.org/) Why Kotlin? • Concise: drastically reduce the amount of boilerplate code you need to write. • Safe: avoid entire classes of errors such as null pointer exceptions. • Interoperable: leverage existing frameworks and libraries of the JVM with 100% Java Interoperability. and more... http://kotlinlang.org/docs/reference/comparison-to-java.html
  3. vs public class MyKotlinClass { val a: Int = 1

    } public class MyJavaClass { private final int a = 1; public int getA() { return a; } } #1 Kotlin - Properties: val, var http://kotlinlang.org/docs/reference/properties.html
  4. public class MyKotlinClass { val a: Int = 1 var

    b: Int = 1 } public class MyJavaClass { private final int a = 1; private int b = 1; public int getA() { return a; } public int getB() { return b; } public void setB(int b) { this.b = b; } } #1 Kotlin - Properties: val, var http://kotlinlang.org/docs/reference/properties.html vs
  5. public class MyKotlinClass { val a: Int = 1 var

    b: Int = 1 val c = 1 var d = 1 } public class MyJavaClass { private final int a = 1; private int b = 1; private final int c = 1; private int d = 1; public int getA() { return a; } public int getB() { return b; } public void setB(int b) { this.b = b; } public int getC() { return c; } public int getD() { return d; } public void setD(int d) { this.d = d; } } #1 Kotlin - Properties: val, var http://kotlinlang.org/docs/reference/properties.html vs
  6. class MyKotlinClass { val name = "Omar" val surname =

    "Miatello" } class MyJavaClass { final String getName() { return "Omar"; } final String getSurname() { return "Miatello"; } } #2 Kotlin - String templates http://kotlinlang.org/docs/reference/basic-syntax.html#using-string-templates vs
  7. class MyKotlinClass { val name = "Omar" val surname =

    "Miatello" val example = "My name is $name $surname" } class MyJavaClass { final String getName() { return "Omar"; } final String getSurname() { return "Miatello"; } final String getExample() { return String.format("My name is %s %s", getName(), getSurname()); } } #2 Kotlin - String templates http://kotlinlang.org/docs/reference/basic-syntax.html#using-string-templates vs
  8. class MyKotlinClass { val name = "Omar" val surname =

    "Miatello" val example = "My name is $name $surname" } class MyJavaClass { final String getName() { return "Omar"; } final String getSurname() { return "Miatello"; } final String getExample() { return String.format("My name is %s %s", getName(), getSurname()); } } #2 Kotlin - String templates http://kotlinlang.org/docs/reference/basic-syntax.html#using-string-templates vs
  9. class MyActivity : Activity() { fun example() { val view

    = findViewById(R.id.button) view.setOnClickListener { } } } class MyActivity extends Activity { void example() { View view = findViewById(R.id.button); view.setOnClickListener( ); } } #3 Kotlin - Lambdas http://kotlinlang.org/docs/reference/coding-conventions.html#lambdas vs
  10. class MyActivity : Activity() { fun example() { val view

    = findViewById(R.id.button) view.setOnClickListener { Log.d("TAG", "Item clicked!") } } } class MyActivity extends Activity { void example() { View view = findViewById(R.id.button); view.setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { Log.d("TAG", "Item clicked!"); } } ); } } #3 Kotlin - Lambdas http://kotlinlang.org/docs/reference/coding-conventions.html#lambdas vs
  11. class MyActivity : Activity() { fun example() { val view

    = findViewById(R.id.button) view.setOnClickListener { Log.d("TAG", "Item clicked!") } } } class MyActivity extends Activity { void example() { View view = findViewById(R.id.button); view.setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { Log.d("TAG", "Item clicked!"); } } ); } } #3 Kotlin - Lambdas http://kotlinlang.org/docs/reference/coding-conventions.html#lambdas vs
  12. class MyJavaClass { class MyItem { } MyItem item; }

    #4 Kotlin - Delegated Properties: lazy (as example) http://kotlinlang.org/docs/reference/delegated-properties.html vs
  13. class MyJavaClass { class MyItem { } MyItem item; final

    MyItem getItem() { if (item == null) { item = new MyItem(); } return item; } } #4 Kotlin - Delegated Properties: lazy (as example) http://kotlinlang.org/docs/reference/delegated-properties.html vs
  14. class MyItem class MyKotlinClass { val item by lazy {

    MyItem() } } // Simplified: in Kotlin is synchronized class MyJavaClass { class MyItem { } MyItem item; final MyItem getItem() { if (item == null) { item = new MyItem(); } return item; } } #4 Kotlin - Delegated Properties: lazy (as example) http://kotlinlang.org/docs/reference/delegated-properties.html vs
  15. 1. Open “Preferences” 2. Choose “Plugins” and “Install JetBrains plugin…”

    3. Install “Kotlin” and “Kotlin Extensions For Android” Install Kotlin in Android Studio
  16. 1. Open “Preferences” 2. Choose “Plugins” and “Install JetBrains plugin…”

    3. Install “Kotlin” and “Kotlin Extensions For Android” 4. Restart Android Studio, and open (or create) a project Install Kotlin in Android Studio
  17. 1. Open “Preferences” 2. Choose “Plugins” and “Install JetBrains plugin…”

    3. Install “Kotlin” and “Kotlin Extensions For Android” 4. Restart Android Studio, and open (or create) a project 5. Create a new “Kotlin class” Install Kotlin in Android Studio
  18. dummy/HeroItem.java public class HeroItem { public final String id; public

    final String content; public final String details; public HeroItem(String id, String content, String details) { this.id = id; this.content = content; this.details = details; } @Override public String toString() { return content; } }
  19. dummy/HeroItem.java public class HeroItem { public final String id; public

    final String content; public final String details; public HeroItem(String id, String content, String details) { this.id = id; this.content = content; this.details = details; } @Override public String toString() { return content; } } “Convert Java File to Kotlin File” CTRL + ALT + SHIFT + K (or CMD + ALT + SHIFT + K)
  20. dummy/HeroItem.kt class HeroItem(val id: String, val content: String, val details:

    String) { override fun toString(): String { return content } }
  21. dummy/Items.kt (... a new hope) data class HeroItem(val id: String,

    val content: String, val details: String) data class VillanItem(val name: String, val power: String) data class SpacecraftItem(val armaments: String, val defenses: String) data class TinyItem(val name: String) // ...
  22. dummy/HeroAdapter.java (before HeroItem Conversion) public class HeroAdapter extends RecyclerView.Adapter<HeroAdapter.ViewHolder> {

    // ... @Override public void onBindViewHolder(final ViewHolder holder, int position) { HeroItem item = mValues.get(position); holder.item = item; holder.idView.setText(item.id); holder.contentView.setText(item.content); // ... } // ... }
  23. dummy/HeroAdapter.java (after HeroItem Conversion) public class HeroAdapter extends RecyclerView.Adapter<HeroAdapter.ViewHolder> {

    // ... @Override public void onBindViewHolder(final ViewHolder holder, int position) { HeroItem item = mValues.get(position); holder.item = item; holder.idView.setText(item.getId()); holder.contentView.setText(item.getContent()); // ... } // ... }
  24. 1. Open “Preferences” 2. Choose “Plugins” and “Install JetBrains plugin…”

    3. Install “Kotlin” and “Kotlin Extensions For Android” 4. Restart Android Studio, and open (or create) a project 5. Create a new “Kotlin class” 6. Choose from menu “Tools” > “Kotlin” > “Configure Kotlin in Project” Install Kotlin in Android Studio
  25. 1. Open “Preferences” 2. Choose “Plugins” and “Install JetBrains plugin…”

    3. Install “Kotlin” and “Kotlin Extensions For Android” 4. Restart Android Studio, and open (or create) a project 5. Create a new “Kotlin class” 6. Choose from menu “Tools” > “Kotlin” > “Configure Kotlin in Project” 7. Ready for Kotlin! :) dependencies { // other dependencies ... compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" } buildscript { ext.kotlin_version = '1.0.0-beta-2423' repositories { mavenCentral() } dependencies { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" } } repositories { mavenCentral() } Install Kotlin in Android Studio
  26. dummy/HeroAdapter.java public class HeroAdapter extends RecyclerView.Adapter<HeroAdapter.ViewHolder> { private final List<HeroItem>

    mValues; private final HeroOnClickListener mListener; public HeroAdapter(List<HeroItem> items, HeroOnClickListener listener) { mValues = items; mListener = listener; } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_hero, parent, false); return new ViewHolder(view); } @Override public void onBindViewHolder(final ViewHolder holder, int position) { HeroItem item = mValues.get(position); “Convert Java File to Kotlin File” CTRL + ALT + SHIFT + K (or CMD + ALT + SHIFT + K)
  27. dummy/HeroAdapter.kt (need manual fix) // ... inner class ViewHolder(view: View)

    : RecyclerView.ViewHolder(view) { val idView: TextView val contentView: TextView var item: HeroItem init { idView = view.findViewById(R.id.id) as TextView contentView = view.findViewById(R.id.content) as TextView } } // ...
  28. dummy/HeroAdapter.kt (fixed!) // ... inner class ViewHolder(view: View) : RecyclerView.ViewHolder(view)

    { val idView: TextView val contentView: TextView var item: HeroItem? = null init { idView = view.findViewById(R.id.id) as TextView contentView = view.findViewById(R.id.content) as TextView } } // ...
  29. dummy/HeroAdapter.kt (optimized) // OPTIMIZATION 1: In class constructor val mListener:

    HeroOnClickListener? // can be replaced with val mListener: Function1<HeroItem, Unit>? // OPTIMIZATION 2: Method definition override fun getItemCount(): Int { return mValues.size } // can be replaced with override fun getItemCount() = mValues.size
  30. MainActivity.java public class MainActivity extends AppCompatActivity { private Toolbar toolbar;

    private FloatingActionButton fab; private RecyclerView recyclerView; private HeroAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); fab = (FloatingActionButton) findViewById(R.id.fab); fab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) “Convert Java File to Kotlin File” CTRL + ALT + SHIFT + K (or CMD + ALT + SHIFT + K)
  31. MainActivity.kt (optimized, use lazy for adapter) import kotlinx.android.synthetic.activity_main.* class MainActivity

    : AppCompatActivity() { private val adapter by lazy { HeroAdapter(HeroDummyContent.ITEMS) { Snackbar.make(fab, "Tap on: " + it, Snackbar.LENGTH_SHORT).show() } }
  32. MainActivity.kt (optimized, remove all unused property) import kotlinx.android.synthetic.activity_main.* class MainActivity

    : AppCompatActivity() { private val adapter by lazy { HeroAdapter(HeroDummyContent.ITEMS) { Snackbar.make(fab, "Tap on: " + it, Snackbar.LENGTH_SHORT).show() } } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) setSupportActionBar(toolbar) fab.setOnClickListener { Snackbar.make(it, "...", Snackbar.LENGTH_LONG).setAction("Action", null).show() } recyclerView.layoutManager = LinearLayoutManager(this) recyclerView.adapter = adapter } }
  33. Questions? Developers playground - #EX1 - Add properties to HeroItem:

    name, gender (String), power (Int) - Show item in list like: “$name (Power: $power)” - Choose (and keep in memory) hero “onClick” - Fight with second “onClick” (show a Snackbar) Hint: Add in MainActivity “selectedHero” property (in Kotlin, or use field in Java) Start with: https://github.com/jacklt/KotlinExample/tree/java-version or https://github.com/jacklt/KotlinExample/tree/kotlin-version Solution: https://github.com/jacklt/KotlinExample/tree/ex1