SlideShare a Scribd company logo
Android & Kotlin
The code awakens #01
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
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
Kotlin vs Java - Part 1
Property
String templates
Lambdas
Lazy properties
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
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
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
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
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
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
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
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
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
class MyJavaClass {
class MyItem { }
MyItem item;
}
#4 Kotlin - Delegated Properties: lazy (as example)
http://kotlinlang.org/docs/reference/delegated-properties.html
vs
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
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
Install Kotlin in Android Studio
Part 1 / 2
1. Open “Preferences”
Install Kotlin in Android Studio
1. Open “Preferences”
2. Choose “Plugins” and “Install
JetBrains plugin…”
Install Kotlin in Android Studio
1. Open “Preferences”
2. Choose “Plugins” and “Install
JetBrains plugin…”
3. Install “Kotlin” and “Kotlin
Extensions For Android”
Install Kotlin in Android Studio
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
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
Android Example
From Java to Kotlin! (step1)
https://github.com/jacklt/KotlinExample/tree/java-version
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;
}
}
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)
dummy/HeroItem.kt
class HeroItem(val id: String, val content: String, val details: String) {
override fun toString(): String {
return content
}
}
dummy/HeroItem.kt (optimized)
data class HeroItem(val id: String, val content: String, val details: String)
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)
// ...
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);
// ...
}
// ...
}
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());
// ...
}
// ...
}
Install Kotlin in Android Studio
Part 2 / 2
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
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”
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
Android Example
From Java to Kotlin! (step2)
HeroAdapter
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)
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
}
}
// ...
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
}
}
// ...
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
Android Example
From Java to Kotlin! (step3)
MainActivity
with Kotlin Android Extension
build.gradle (add kotlin-android-extensions)
// ..
dependencies {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath "org.jetbrains.kotlin:kotlin-android-extensions:$kotlin_version"
}
// ..
build.gradle (add kotlin-android-extensions)
// ..
dependencies {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath "org.jetbrains.kotlin:kotlin-android-extensions:$kotlin_version"
}
// ..
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)
MainActivity.kt (optimized, add import)
import kotlinx.android.synthetic.activity_main.*
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() }
}
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
}
}
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
THANKS!
Omar Miatello, Member of GDG Milano (Italy)
Android Developer @ Satispay

More Related Content

What's hot

Kotlin: lo Swift di Android (2015)
Kotlin: lo Swift di Android (2015)Kotlin: lo Swift di Android (2015)
Kotlin: lo Swift di Android (2015)
Omar Miatello
 
Functional Programming & Event Sourcing - a pair made in heaven
Functional Programming & Event Sourcing - a pair made in heavenFunctional Programming & Event Sourcing - a pair made in heaven
Functional Programming & Event Sourcing - a pair made in heaven
Pawel Szulc
 
Unit testing without Robolectric, Droidcon Berlin 2016
Unit testing without Robolectric, Droidcon Berlin 2016Unit testing without Robolectric, Droidcon Berlin 2016
Unit testing without Robolectric, Droidcon Berlin 2016
Danny Preussler
 
Building native Android applications with Mirah and Pindah
Building native Android applications with Mirah and PindahBuilding native Android applications with Mirah and Pindah
Building native Android applications with Mirah and Pindah
Nick Plante
 
Mastering Java Bytecode With ASM - 33rd degree, 2012
Mastering Java Bytecode With ASM - 33rd degree, 2012Mastering Java Bytecode With ASM - 33rd degree, 2012
Mastering Java Bytecode With ASM - 33rd degree, 2012Anton Arhipov
 
GeeCON 2017 - TestContainers. Integration testing without the hassle
GeeCON 2017 - TestContainers. Integration testing without the hassleGeeCON 2017 - TestContainers. Integration testing without the hassle
GeeCON 2017 - TestContainers. Integration testing without the hassle
Anton Arhipov
 
EMF Tips n Tricks
EMF Tips n TricksEMF Tips n Tricks
EMF Tips n Tricks
Kaniska Mandal
 
Using Reflections and Automatic Code Generation
Using Reflections and Automatic Code GenerationUsing Reflections and Automatic Code Generation
Using Reflections and Automatic Code Generation
Ivan Dolgushin
 
Ast transformations
Ast transformationsAst transformations
Ast transformations
HamletDRC
 
AST Transformations
AST TransformationsAST Transformations
AST TransformationsHamletDRC
 
Real world gobbledygook
Real world gobbledygookReal world gobbledygook
Real world gobbledygook
Pawel Szulc
 
Mastering Java ByteCode
Mastering Java ByteCodeMastering Java ByteCode
Mastering Java ByteCode
Ecommerce Solution Provider SysIQ
 
Kotlin Generation
Kotlin GenerationKotlin Generation
Kotlin Generation
Minseo Chayabanjonglerd
 
JEEConf 2017 - Having fun with Javassist
JEEConf 2017 - Having fun with JavassistJEEConf 2017 - Having fun with Javassist
JEEConf 2017 - Having fun with Javassist
Anton Arhipov
 
The Xtext Grammar Language
The Xtext Grammar LanguageThe Xtext Grammar Language
The Xtext Grammar Language
Dr. Jan Köhnlein
 
Kotlin
KotlinKotlin
Kotlin
Rory Preddy
 
Riga DevDays 2017 - The hitchhiker’s guide to Java class reloading
Riga DevDays 2017 - The hitchhiker’s guide to Java class reloadingRiga DevDays 2017 - The hitchhiker’s guide to Java class reloading
Riga DevDays 2017 - The hitchhiker’s guide to Java class reloading
Anton Arhipov
 
Java Full Throttle
Java Full ThrottleJava Full Throttle
Java Full Throttle
José Paumard
 
Clean code with google guava jee conf
Clean code with google guava jee confClean code with google guava jee conf
Clean code with google guava jee conf
Igor Anishchenko
 
Letswift Swift 3.0
Letswift Swift 3.0Letswift Swift 3.0
Letswift Swift 3.0
Sehyun Park
 

What's hot (20)

Kotlin: lo Swift di Android (2015)
Kotlin: lo Swift di Android (2015)Kotlin: lo Swift di Android (2015)
Kotlin: lo Swift di Android (2015)
 
Functional Programming & Event Sourcing - a pair made in heaven
Functional Programming & Event Sourcing - a pair made in heavenFunctional Programming & Event Sourcing - a pair made in heaven
Functional Programming & Event Sourcing - a pair made in heaven
 
Unit testing without Robolectric, Droidcon Berlin 2016
Unit testing without Robolectric, Droidcon Berlin 2016Unit testing without Robolectric, Droidcon Berlin 2016
Unit testing without Robolectric, Droidcon Berlin 2016
 
Building native Android applications with Mirah and Pindah
Building native Android applications with Mirah and PindahBuilding native Android applications with Mirah and Pindah
Building native Android applications with Mirah and Pindah
 
Mastering Java Bytecode With ASM - 33rd degree, 2012
Mastering Java Bytecode With ASM - 33rd degree, 2012Mastering Java Bytecode With ASM - 33rd degree, 2012
Mastering Java Bytecode With ASM - 33rd degree, 2012
 
GeeCON 2017 - TestContainers. Integration testing without the hassle
GeeCON 2017 - TestContainers. Integration testing without the hassleGeeCON 2017 - TestContainers. Integration testing without the hassle
GeeCON 2017 - TestContainers. Integration testing without the hassle
 
EMF Tips n Tricks
EMF Tips n TricksEMF Tips n Tricks
EMF Tips n Tricks
 
Using Reflections and Automatic Code Generation
Using Reflections and Automatic Code GenerationUsing Reflections and Automatic Code Generation
Using Reflections and Automatic Code Generation
 
Ast transformations
Ast transformationsAst transformations
Ast transformations
 
AST Transformations
AST TransformationsAST Transformations
AST Transformations
 
Real world gobbledygook
Real world gobbledygookReal world gobbledygook
Real world gobbledygook
 
Mastering Java ByteCode
Mastering Java ByteCodeMastering Java ByteCode
Mastering Java ByteCode
 
Kotlin Generation
Kotlin GenerationKotlin Generation
Kotlin Generation
 
JEEConf 2017 - Having fun with Javassist
JEEConf 2017 - Having fun with JavassistJEEConf 2017 - Having fun with Javassist
JEEConf 2017 - Having fun with Javassist
 
The Xtext Grammar Language
The Xtext Grammar LanguageThe Xtext Grammar Language
The Xtext Grammar Language
 
Kotlin
KotlinKotlin
Kotlin
 
Riga DevDays 2017 - The hitchhiker’s guide to Java class reloading
Riga DevDays 2017 - The hitchhiker’s guide to Java class reloadingRiga DevDays 2017 - The hitchhiker’s guide to Java class reloading
Riga DevDays 2017 - The hitchhiker’s guide to Java class reloading
 
Java Full Throttle
Java Full ThrottleJava Full Throttle
Java Full Throttle
 
Clean code with google guava jee conf
Clean code with google guava jee confClean code with google guava jee conf
Clean code with google guava jee conf
 
Letswift Swift 3.0
Letswift Swift 3.0Letswift Swift 3.0
Letswift Swift 3.0
 

Viewers also liked

Exploring Anko Components, Kotlin, Android
Exploring Anko Components, Kotlin, AndroidExploring Anko Components, Kotlin, Android
Exploring Anko Components, Kotlin, Android
Rakshak R.Hegde
 
Smoothing Your Java with DSLs
Smoothing Your Java with DSLsSmoothing Your Java with DSLs
Smoothing Your Java with DSLsintelliyole
 
Getting started-kotlin-android
Getting started-kotlin-androidGetting started-kotlin-android
Getting started-kotlin-android
Lucas Albuquerque
 
No excuses, switch to kotlin
No excuses, switch to kotlinNo excuses, switch to kotlin
No excuses, switch to kotlin
Thijs Suijten
 
Little Helpers for Android Development with Kotlin
Little Helpers for Android Development with KotlinLittle Helpers for Android Development with Kotlin
Little Helpers for Android Development with Kotlin
Kai Koenig
 
Android Workshop
Android WorkshopAndroid Workshop
Android Workshop
Rakshak R.Hegde
 
Kotlin in action
Kotlin in actionKotlin in action
Kotlin in action
Ciro Rizzo
 
First few months with Kotlin - Introduction through android examples
First few months with Kotlin - Introduction through android examplesFirst few months with Kotlin - Introduction through android examples
First few months with Kotlin - Introduction through android examples
Nebojša Vukšić
 

Viewers also liked (8)

Exploring Anko Components, Kotlin, Android
Exploring Anko Components, Kotlin, AndroidExploring Anko Components, Kotlin, Android
Exploring Anko Components, Kotlin, Android
 
Smoothing Your Java with DSLs
Smoothing Your Java with DSLsSmoothing Your Java with DSLs
Smoothing Your Java with DSLs
 
Getting started-kotlin-android
Getting started-kotlin-androidGetting started-kotlin-android
Getting started-kotlin-android
 
No excuses, switch to kotlin
No excuses, switch to kotlinNo excuses, switch to kotlin
No excuses, switch to kotlin
 
Little Helpers for Android Development with Kotlin
Little Helpers for Android Development with KotlinLittle Helpers for Android Development with Kotlin
Little Helpers for Android Development with Kotlin
 
Android Workshop
Android WorkshopAndroid Workshop
Android Workshop
 
Kotlin in action
Kotlin in actionKotlin in action
Kotlin in action
 
First few months with Kotlin - Introduction through android examples
First few months with Kotlin - Introduction through android examplesFirst few months with Kotlin - Introduction through android examples
First few months with Kotlin - Introduction through android examples
 

Similar to Android & Kotlin - The code awakens #01

Koin Quickstart
Koin QuickstartKoin Quickstart
Koin Quickstart
Matthew Clarke
 
Kotlin for Android - Vali Iorgu - mRready
Kotlin for Android - Vali Iorgu - mRreadyKotlin for Android - Vali Iorgu - mRready
Kotlin for Android - Vali Iorgu - mRready
MobileAcademy
 
Having Fun with Kotlin Android - DILo Surabaya
Having Fun with Kotlin Android - DILo SurabayaHaving Fun with Kotlin Android - DILo Surabaya
Having Fun with Kotlin Android - DILo Surabaya
DILo Surabaya
 
Writing Kotlin Multiplatform libraries that your iOS teammates are gonna love
Writing Kotlin Multiplatform libraries that your iOS teammates are gonna loveWriting Kotlin Multiplatform libraries that your iOS teammates are gonna love
Writing Kotlin Multiplatform libraries that your iOS teammates are gonna love
André Oriani
 
Coroutines for Kotlin Multiplatform in Practise
Coroutines for Kotlin Multiplatform in PractiseCoroutines for Kotlin Multiplatform in Practise
Coroutines for Kotlin Multiplatform in Practise
Christian Melchior
 
Dependency Injection for Android @ Ciklum speakers corner Kiev 29. May 2014
Dependency Injection for Android @ Ciklum speakers corner Kiev 29. May 2014Dependency Injection for Android @ Ciklum speakers corner Kiev 29. May 2014
Dependency Injection for Android @ Ciklum speakers corner Kiev 29. May 2014
First Tuesday Bergen
 
Dependency Injection for Android
Dependency Injection for AndroidDependency Injection for Android
Dependency Injection for Android
First Tuesday Bergen
 
Using hilt in a modularized project
Using hilt in a modularized projectUsing hilt in a modularized project
Using hilt in a modularized project
Fabio Collini
 
Bring the fun back to java
Bring the fun back to javaBring the fun back to java
Bring the fun back to java
ciklum_ods
 
The Naked Bundle - Symfony Live London 2014
The Naked Bundle - Symfony Live London 2014The Naked Bundle - Symfony Live London 2014
The Naked Bundle - Symfony Live London 2014
Matthias Noback
 
From Legacy to Hexagonal (An Unexpected Android Journey)
From Legacy to Hexagonal (An Unexpected Android Journey)From Legacy to Hexagonal (An Unexpected Android Journey)
From Legacy to Hexagonal (An Unexpected Android Journey)
Jose Manuel Pereira Garcia
 
Jeff English: Demystifying Module Development - How to Extend Titanium
Jeff English: Demystifying Module Development - How to Extend TitaniumJeff English: Demystifying Module Development - How to Extend Titanium
Jeff English: Demystifying Module Development - How to Extend Titanium
Axway Appcelerator
 
[2019] PAYCO 매거진 서버 Kotlin 적용기
[2019] PAYCO 매거진 서버 Kotlin 적용기[2019] PAYCO 매거진 서버 Kotlin 적용기
[2019] PAYCO 매거진 서버 Kotlin 적용기
NHN FORWARD
 
Sharper Better Faster Dagger ‡ - Droidcon SF
Sharper Better Faster Dagger ‡ - Droidcon SFSharper Better Faster Dagger ‡ - Droidcon SF
Sharper Better Faster Dagger ‡ - Droidcon SF
Pierre-Yves Ricau
 
Building Modern Apps using Android Architecture Components
Building Modern Apps using Android Architecture ComponentsBuilding Modern Apps using Android Architecture Components
Building Modern Apps using Android Architecture Components
Hassan Abid
 
Kotlin Advanced - language reference for Android developers
Kotlin Advanced - language reference for Android developers Kotlin Advanced - language reference for Android developers
Kotlin Advanced - language reference for Android developers
STX Next
 
Kotlinでテストコードを書く
Kotlinでテストコードを書くKotlinでテストコードを書く
Kotlinでテストコードを書く
Shoichi Matsuda
 
Why Spring <3 Kotlin
Why Spring <3 KotlinWhy Spring <3 Kotlin
Why Spring <3 Kotlin
VMware Tanzu
 
Android and the Seven Dwarfs from Devox'15
Android and the Seven Dwarfs from Devox'15Android and the Seven Dwarfs from Devox'15
Android and the Seven Dwarfs from Devox'15
Murat Yener
 
The Naked Bundle - Symfony Usergroup Belgium
The Naked Bundle - Symfony Usergroup BelgiumThe Naked Bundle - Symfony Usergroup Belgium
The Naked Bundle - Symfony Usergroup Belgium
Matthias Noback
 

Similar to Android & Kotlin - The code awakens #01 (20)

Koin Quickstart
Koin QuickstartKoin Quickstart
Koin Quickstart
 
Kotlin for Android - Vali Iorgu - mRready
Kotlin for Android - Vali Iorgu - mRreadyKotlin for Android - Vali Iorgu - mRready
Kotlin for Android - Vali Iorgu - mRready
 
Having Fun with Kotlin Android - DILo Surabaya
Having Fun with Kotlin Android - DILo SurabayaHaving Fun with Kotlin Android - DILo Surabaya
Having Fun with Kotlin Android - DILo Surabaya
 
Writing Kotlin Multiplatform libraries that your iOS teammates are gonna love
Writing Kotlin Multiplatform libraries that your iOS teammates are gonna loveWriting Kotlin Multiplatform libraries that your iOS teammates are gonna love
Writing Kotlin Multiplatform libraries that your iOS teammates are gonna love
 
Coroutines for Kotlin Multiplatform in Practise
Coroutines for Kotlin Multiplatform in PractiseCoroutines for Kotlin Multiplatform in Practise
Coroutines for Kotlin Multiplatform in Practise
 
Dependency Injection for Android @ Ciklum speakers corner Kiev 29. May 2014
Dependency Injection for Android @ Ciklum speakers corner Kiev 29. May 2014Dependency Injection for Android @ Ciklum speakers corner Kiev 29. May 2014
Dependency Injection for Android @ Ciklum speakers corner Kiev 29. May 2014
 
Dependency Injection for Android
Dependency Injection for AndroidDependency Injection for Android
Dependency Injection for Android
 
Using hilt in a modularized project
Using hilt in a modularized projectUsing hilt in a modularized project
Using hilt in a modularized project
 
Bring the fun back to java
Bring the fun back to javaBring the fun back to java
Bring the fun back to java
 
The Naked Bundle - Symfony Live London 2014
The Naked Bundle - Symfony Live London 2014The Naked Bundle - Symfony Live London 2014
The Naked Bundle - Symfony Live London 2014
 
From Legacy to Hexagonal (An Unexpected Android Journey)
From Legacy to Hexagonal (An Unexpected Android Journey)From Legacy to Hexagonal (An Unexpected Android Journey)
From Legacy to Hexagonal (An Unexpected Android Journey)
 
Jeff English: Demystifying Module Development - How to Extend Titanium
Jeff English: Demystifying Module Development - How to Extend TitaniumJeff English: Demystifying Module Development - How to Extend Titanium
Jeff English: Demystifying Module Development - How to Extend Titanium
 
[2019] PAYCO 매거진 서버 Kotlin 적용기
[2019] PAYCO 매거진 서버 Kotlin 적용기[2019] PAYCO 매거진 서버 Kotlin 적용기
[2019] PAYCO 매거진 서버 Kotlin 적용기
 
Sharper Better Faster Dagger ‡ - Droidcon SF
Sharper Better Faster Dagger ‡ - Droidcon SFSharper Better Faster Dagger ‡ - Droidcon SF
Sharper Better Faster Dagger ‡ - Droidcon SF
 
Building Modern Apps using Android Architecture Components
Building Modern Apps using Android Architecture ComponentsBuilding Modern Apps using Android Architecture Components
Building Modern Apps using Android Architecture Components
 
Kotlin Advanced - language reference for Android developers
Kotlin Advanced - language reference for Android developers Kotlin Advanced - language reference for Android developers
Kotlin Advanced - language reference for Android developers
 
Kotlinでテストコードを書く
Kotlinでテストコードを書くKotlinでテストコードを書く
Kotlinでテストコードを書く
 
Why Spring <3 Kotlin
Why Spring <3 KotlinWhy Spring <3 Kotlin
Why Spring <3 Kotlin
 
Android and the Seven Dwarfs from Devox'15
Android and the Seven Dwarfs from Devox'15Android and the Seven Dwarfs from Devox'15
Android and the Seven Dwarfs from Devox'15
 
The Naked Bundle - Symfony Usergroup Belgium
The Naked Bundle - Symfony Usergroup BelgiumThe Naked Bundle - Symfony Usergroup Belgium
The Naked Bundle - Symfony Usergroup Belgium
 

Recently uploaded

Navigating the Metaverse: A Journey into Virtual Evolution"
Navigating the Metaverse: A Journey into Virtual Evolution"Navigating the Metaverse: A Journey into Virtual Evolution"
Navigating the Metaverse: A Journey into Virtual Evolution"
Donna Lenk
 
Custom Healthcare Software for Managing Chronic Conditions and Remote Patient...
Custom Healthcare Software for Managing Chronic Conditions and Remote Patient...Custom Healthcare Software for Managing Chronic Conditions and Remote Patient...
Custom Healthcare Software for Managing Chronic Conditions and Remote Patient...
Mind IT Systems
 
Need for Speed: Removing speed bumps from your Symfony projects ⚡️
Need for Speed: Removing speed bumps from your Symfony projects ⚡️Need for Speed: Removing speed bumps from your Symfony projects ⚡️
Need for Speed: Removing speed bumps from your Symfony projects ⚡️
Łukasz Chruściel
 
Webinar: Salesforce Document Management 2.0 - Smarter, Faster, Better
Webinar: Salesforce Document Management 2.0 - Smarter, Faster, BetterWebinar: Salesforce Document Management 2.0 - Smarter, Faster, Better
Webinar: Salesforce Document Management 2.0 - Smarter, Faster, Better
XfilesPro
 
Quarkus Hidden and Forbidden Extensions
Quarkus Hidden and Forbidden ExtensionsQuarkus Hidden and Forbidden Extensions
Quarkus Hidden and Forbidden Extensions
Max Andersen
 
Utilocate provides Smarter, Better, Faster, Safer Locate Ticket Management
Utilocate provides Smarter, Better, Faster, Safer Locate Ticket ManagementUtilocate provides Smarter, Better, Faster, Safer Locate Ticket Management
Utilocate provides Smarter, Better, Faster, Safer Locate Ticket Management
Utilocate
 
OpenMetadata Community Meeting - 5th June 2024
OpenMetadata Community Meeting - 5th June 2024OpenMetadata Community Meeting - 5th June 2024
OpenMetadata Community Meeting - 5th June 2024
OpenMetadata
 
2024 eCommerceDays Toulouse - Sylius 2.0.pdf
2024 eCommerceDays Toulouse - Sylius 2.0.pdf2024 eCommerceDays Toulouse - Sylius 2.0.pdf
2024 eCommerceDays Toulouse - Sylius 2.0.pdf
Łukasz Chruściel
 
Globus Compute wth IRI Workflows - GlobusWorld 2024
Globus Compute wth IRI Workflows - GlobusWorld 2024Globus Compute wth IRI Workflows - GlobusWorld 2024
Globus Compute wth IRI Workflows - GlobusWorld 2024
Globus
 
Mobile App Development Company In Noida | Drona Infotech
Mobile App Development Company In Noida | Drona InfotechMobile App Development Company In Noida | Drona Infotech
Mobile App Development Company In Noida | Drona Infotech
Drona Infotech
 
AI Pilot Review: The World’s First Virtual Assistant Marketing Suite
AI Pilot Review: The World’s First Virtual Assistant Marketing SuiteAI Pilot Review: The World’s First Virtual Assistant Marketing Suite
AI Pilot Review: The World’s First Virtual Assistant Marketing Suite
Google
 
BoxLang: Review our Visionary Licenses of 2024
BoxLang: Review our Visionary Licenses of 2024BoxLang: Review our Visionary Licenses of 2024
BoxLang: Review our Visionary Licenses of 2024
Ortus Solutions, Corp
 
Atelier - Innover avec l’IA Générative et les graphes de connaissances
Atelier - Innover avec l’IA Générative et les graphes de connaissancesAtelier - Innover avec l’IA Générative et les graphes de connaissances
Atelier - Innover avec l’IA Générative et les graphes de connaissances
Neo4j
 
A Study of Variable-Role-based Feature Enrichment in Neural Models of Code
A Study of Variable-Role-based Feature Enrichment in Neural Models of CodeA Study of Variable-Role-based Feature Enrichment in Neural Models of Code
A Study of Variable-Role-based Feature Enrichment in Neural Models of Code
Aftab Hussain
 
Enterprise Software Development with No Code Solutions.pptx
Enterprise Software Development with No Code Solutions.pptxEnterprise Software Development with No Code Solutions.pptx
Enterprise Software Development with No Code Solutions.pptx
QuickwayInfoSystems3
 
Innovating Inference - Remote Triggering of Large Language Models on HPC Clus...
Innovating Inference - Remote Triggering of Large Language Models on HPC Clus...Innovating Inference - Remote Triggering of Large Language Models on HPC Clus...
Innovating Inference - Remote Triggering of Large Language Models on HPC Clus...
Globus
 
Vitthal Shirke Java Microservices Resume.pdf
Vitthal Shirke Java Microservices Resume.pdfVitthal Shirke Java Microservices Resume.pdf
Vitthal Shirke Java Microservices Resume.pdf
Vitthal Shirke
 
Nidhi Software Price. Fact , Costs, Tips
Nidhi Software Price. Fact , Costs, TipsNidhi Software Price. Fact , Costs, Tips
Nidhi Software Price. Fact , Costs, Tips
vrstrong314
 
Large Language Models and the End of Programming
Large Language Models and the End of ProgrammingLarge Language Models and the End of Programming
Large Language Models and the End of Programming
Matt Welsh
 
GOING AOT WITH GRAALVM FOR SPRING BOOT (SPRING IO)
GOING AOT WITH GRAALVM FOR  SPRING BOOT (SPRING IO)GOING AOT WITH GRAALVM FOR  SPRING BOOT (SPRING IO)
GOING AOT WITH GRAALVM FOR SPRING BOOT (SPRING IO)
Alina Yurenko
 

Recently uploaded (20)

Navigating the Metaverse: A Journey into Virtual Evolution"
Navigating the Metaverse: A Journey into Virtual Evolution"Navigating the Metaverse: A Journey into Virtual Evolution"
Navigating the Metaverse: A Journey into Virtual Evolution"
 
Custom Healthcare Software for Managing Chronic Conditions and Remote Patient...
Custom Healthcare Software for Managing Chronic Conditions and Remote Patient...Custom Healthcare Software for Managing Chronic Conditions and Remote Patient...
Custom Healthcare Software for Managing Chronic Conditions and Remote Patient...
 
Need for Speed: Removing speed bumps from your Symfony projects ⚡️
Need for Speed: Removing speed bumps from your Symfony projects ⚡️Need for Speed: Removing speed bumps from your Symfony projects ⚡️
Need for Speed: Removing speed bumps from your Symfony projects ⚡️
 
Webinar: Salesforce Document Management 2.0 - Smarter, Faster, Better
Webinar: Salesforce Document Management 2.0 - Smarter, Faster, BetterWebinar: Salesforce Document Management 2.0 - Smarter, Faster, Better
Webinar: Salesforce Document Management 2.0 - Smarter, Faster, Better
 
Quarkus Hidden and Forbidden Extensions
Quarkus Hidden and Forbidden ExtensionsQuarkus Hidden and Forbidden Extensions
Quarkus Hidden and Forbidden Extensions
 
Utilocate provides Smarter, Better, Faster, Safer Locate Ticket Management
Utilocate provides Smarter, Better, Faster, Safer Locate Ticket ManagementUtilocate provides Smarter, Better, Faster, Safer Locate Ticket Management
Utilocate provides Smarter, Better, Faster, Safer Locate Ticket Management
 
OpenMetadata Community Meeting - 5th June 2024
OpenMetadata Community Meeting - 5th June 2024OpenMetadata Community Meeting - 5th June 2024
OpenMetadata Community Meeting - 5th June 2024
 
2024 eCommerceDays Toulouse - Sylius 2.0.pdf
2024 eCommerceDays Toulouse - Sylius 2.0.pdf2024 eCommerceDays Toulouse - Sylius 2.0.pdf
2024 eCommerceDays Toulouse - Sylius 2.0.pdf
 
Globus Compute wth IRI Workflows - GlobusWorld 2024
Globus Compute wth IRI Workflows - GlobusWorld 2024Globus Compute wth IRI Workflows - GlobusWorld 2024
Globus Compute wth IRI Workflows - GlobusWorld 2024
 
Mobile App Development Company In Noida | Drona Infotech
Mobile App Development Company In Noida | Drona InfotechMobile App Development Company In Noida | Drona Infotech
Mobile App Development Company In Noida | Drona Infotech
 
AI Pilot Review: The World’s First Virtual Assistant Marketing Suite
AI Pilot Review: The World’s First Virtual Assistant Marketing SuiteAI Pilot Review: The World’s First Virtual Assistant Marketing Suite
AI Pilot Review: The World’s First Virtual Assistant Marketing Suite
 
BoxLang: Review our Visionary Licenses of 2024
BoxLang: Review our Visionary Licenses of 2024BoxLang: Review our Visionary Licenses of 2024
BoxLang: Review our Visionary Licenses of 2024
 
Atelier - Innover avec l’IA Générative et les graphes de connaissances
Atelier - Innover avec l’IA Générative et les graphes de connaissancesAtelier - Innover avec l’IA Générative et les graphes de connaissances
Atelier - Innover avec l’IA Générative et les graphes de connaissances
 
A Study of Variable-Role-based Feature Enrichment in Neural Models of Code
A Study of Variable-Role-based Feature Enrichment in Neural Models of CodeA Study of Variable-Role-based Feature Enrichment in Neural Models of Code
A Study of Variable-Role-based Feature Enrichment in Neural Models of Code
 
Enterprise Software Development with No Code Solutions.pptx
Enterprise Software Development with No Code Solutions.pptxEnterprise Software Development with No Code Solutions.pptx
Enterprise Software Development with No Code Solutions.pptx
 
Innovating Inference - Remote Triggering of Large Language Models on HPC Clus...
Innovating Inference - Remote Triggering of Large Language Models on HPC Clus...Innovating Inference - Remote Triggering of Large Language Models on HPC Clus...
Innovating Inference - Remote Triggering of Large Language Models on HPC Clus...
 
Vitthal Shirke Java Microservices Resume.pdf
Vitthal Shirke Java Microservices Resume.pdfVitthal Shirke Java Microservices Resume.pdf
Vitthal Shirke Java Microservices Resume.pdf
 
Nidhi Software Price. Fact , Costs, Tips
Nidhi Software Price. Fact , Costs, TipsNidhi Software Price. Fact , Costs, Tips
Nidhi Software Price. Fact , Costs, Tips
 
Large Language Models and the End of Programming
Large Language Models and the End of ProgrammingLarge Language Models and the End of Programming
Large Language Models and the End of Programming
 
GOING AOT WITH GRAALVM FOR SPRING BOOT (SPRING IO)
GOING AOT WITH GRAALVM FOR  SPRING BOOT (SPRING IO)GOING AOT WITH GRAALVM FOR  SPRING BOOT (SPRING IO)
GOING AOT WITH GRAALVM FOR SPRING BOOT (SPRING IO)
 

Android & Kotlin - The code awakens #01

  • 1. Android & Kotlin The code awakens #01
  • 2. 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
  • 3. 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
  • 4. Kotlin vs Java - Part 1 Property String templates Lambdas Lazy properties
  • 5. 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
  • 6. 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
  • 7. 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
  • 8. 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
  • 9. 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
  • 10. 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
  • 11. 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
  • 12. 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
  • 13. 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
  • 14. class MyJavaClass { class MyItem { } MyItem item; } #4 Kotlin - Delegated Properties: lazy (as example) http://kotlinlang.org/docs/reference/delegated-properties.html vs
  • 15. 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
  • 16. 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
  • 17. Install Kotlin in Android Studio Part 1 / 2
  • 18. 1. Open “Preferences” Install Kotlin in Android Studio
  • 19. 1. Open “Preferences” 2. Choose “Plugins” and “Install JetBrains plugin…” Install Kotlin in Android Studio
  • 20. 1. Open “Preferences” 2. Choose “Plugins” and “Install JetBrains plugin…” 3. Install “Kotlin” and “Kotlin Extensions For Android” Install Kotlin in Android Studio
  • 21. 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
  • 22. 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
  • 23. Android Example From Java to Kotlin! (step1) https://github.com/jacklt/KotlinExample/tree/java-version
  • 24. 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; } }
  • 25. 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)
  • 26. dummy/HeroItem.kt class HeroItem(val id: String, val content: String, val details: String) { override fun toString(): String { return content } }
  • 27. dummy/HeroItem.kt (optimized) data class HeroItem(val id: String, val content: String, val details: String)
  • 28. 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) // ...
  • 29. 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); // ... } // ... }
  • 30. 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()); // ... } // ... }
  • 31. Install Kotlin in Android Studio Part 2 / 2
  • 32. 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
  • 33. 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” 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
  • 34. Android Example From Java to Kotlin! (step2) HeroAdapter
  • 35. 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)
  • 36. 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 } } // ...
  • 37. 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 } } // ...
  • 38. 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
  • 39. Android Example From Java to Kotlin! (step3) MainActivity with Kotlin Android Extension
  • 40. build.gradle (add kotlin-android-extensions) // .. dependencies { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "org.jetbrains.kotlin:kotlin-android-extensions:$kotlin_version" } // ..
  • 41. build.gradle (add kotlin-android-extensions) // .. dependencies { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "org.jetbrains.kotlin:kotlin-android-extensions:$kotlin_version" } // ..
  • 42. 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)
  • 43. MainActivity.kt (optimized, add import) import kotlinx.android.synthetic.activity_main.*
  • 44. 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() } }
  • 45. 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 } }
  • 46. 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
  • 47. THANKS! Omar Miatello, Member of GDG Milano (Italy) Android Developer @ Satispay