SlideShare a Scribd company logo
1 of 116
Download to read offline
Kotlin	Language	for	
Android	Development
Huỳnh	Quang	Thảo
Silicon	Straits	Saigon
Google	Developer	Expert	on	Android
Java1995
Java
Android
1995
2008
Java
Android
Android	Studio
1995
2008
2013
Java
Android
Android	Studio
Kotlin
1995
2008
2013
2/2016
Java
Android
Android	Studio
Kotlin
Officially	Support	Kotlin
1995
2008
2013
2/2016
5/2017
Java
- Popular.
Java
- Popular.
- Strongly	type	language.
Java
- Popular.
- Strongly	type	language.
- Easy	to	learn.
Java
- Popular.
- Strongly	type	language.
- Easy	to	learn.
- Document.
Why	Java	sucks
Java	culture
Java	culture
C#	has:
- 2007:	lambda	expressions,	extension	methods,	first-class	function
- 2010:	generic	covariance,	contra	variance	…
- 2015:	Null-Conditional	operator.
- 2017:	Pattern	matching
Java	culture
C#	has:
- 2007:	lambda	expressions,	extension	methods,	first-class	function
- 2010:	generic	covariance,	contra	variance	…
- 2015:	Null-Conditional	operator.
- 2017:	Pattern	matching
2014:	Java	is	trying to	adopt	functional	programming	style	from	Java	8
Java	culture
C#	has:
- 2007:	lambda	expressions,	extension	methods,	first-class	function
- 2010:	generic	covariance,	contra	variance	…
- 2015:	Null-Conditional	operator.
- 2017:	Pattern	matching
2014:	Java	is	trying to	adopt	functional	programming	style	from	Java	8	
Avoiding	break	compatible	older	API	
Example:	Generic	API,	Concurrency		Collection	API,….
(historical:	why	exist	javax package)
Null	Safety
public void printClassRoom(Person person) {
System.out.println(person.school.classRoom);
}
Null	Safety
public void printClassRoom(Person person) {
if (person == null) return;
System.out.println(person.school.classRoom);
}
Null	Safety
public void printClassRoom(Person person) {
if (person == null) return;
if (person.school == null) return;
System.out.println(person.school.classRoom);
}
Null	Safety
public void printClassRoom(Person person) {
if (person == null) return;
if (person.school == null) return;
if (person.school.classRoom == null) return;
System.out.println(person.school.classRoom);
}
Null	Safety
public void printClassRoom(Person person) {
if (person == null) return;
if (person.school == null) return;
// if (person.school.classRoom == null) return;
System.out.println(person.school.classRoom);
}
Null	Safety
public void printClassRoom(Person person) {
if (person == null) return;
if (person.school == null) return;
// if (person.school.classRoom == null) return;
System.out.println(person.school.classRoom);
}
Null	Safety
public void printClassRoom(Person person) {
if (person == null) return;
if (person.school.classRoom == null) return;
if (person.school == null) return;
System.out.println(person.school.classRoom);
}
Null	Safety
public void printClassRoom(Person person) {
if (person == null) return;
if (person.school.classRoom == null) return;
if (person.school == null) return;
System.out.println(person.school.classRoom);
}
Null	Safety
Speaking	at	a	conference	in	2009,	Tony	Hoare	apologised	for	inventing	
the	null	reference:
I	call	it	my	billion-dollar	mistake.	This	has	led	to	innumerable	errors,	
vulnerabilities,	and	system	crashes,	which	have	probably	caused	a	
billion	dollars	of	pain	and	damage	in	the	last	forty	years.
Java	generic	type	is	
erasure
List<String> list = new ArrayList<String>();
list.add("Hello Google I/O");
String x = list.get(0);
Java	generic	type	is	
erasure
List<String> list = new ArrayList<String>();
list.add("Hello Google I/O");
String x = list.get(0);
List list = new ArrayList();
list.add("Hi");
String x = (String) list.get(0);
public <T>List<T> castCollection(List srcList, Class<T> clas){
List<T> list =new ArrayList<T>();
for (Object obj : srcList) {
if(obj instanceof T){
// processing code here
}
}
return list;
}
public <T>List<T> castCollection(List srcList, Class<T> clas){
List<T> list =new ArrayList<T>();
for (Object obj : srcList) {
if(obj instanceof T){
// processing code here
}
}
return list;
}
public <T>List<T> castCollection(List srcList, Class<T> clas){
List<Object> list =new ArrayList<Object>();
for (Object obj : srcList) {
if(obj instanceof Object){
// processing code here
}
}
}
Java	array	is	covariance
A	<:	B	=>	T[A]	<:	T[B]
Java	array	is	covariance
A	<:	B	=>	T[A]	<:	T[B]
Employee[] employees = new Employee[10];
Java	array	is	covariance
A	<:	B	=>	T[A]	<:	T[B]
Employee[] employees = new Employee[10];
employees[0] = new Employee();
Java	array	is	covariance
A	<:	B	=>	T[A]	<:	T[B]
Employee[] employees = new Employee[10];
employees[0] = new Employee();
// because Java array is covariance
Person[] people = employees;
Java	array	is	covariance
A	<:	B	=>	T[A]	<:	T[B]
Employee[] employees = new Employee[10];
employees[0] = new Employee();
// because Java array is covariance
Person[] people = employees;
people[0] = new Person();
Java	array	is	covariance
A	<:	B	=>	T[A]	<:	T[B]
Employee[] employees = new Employee[10];
employees[0] = new Employee();
// because Java array is covariance
Person[] people = employees;
people[0] = new Person();
…	And	More
JetBrains	lead	Dmitry	Jemerov	said	that:
Most languages did not have the features they were looking
for, with the exception of Scala. However, he cited the slow
compile time of Scala as an obvious deficiency. One of the
stated goals of Kotlin is to compile as quickly as Java.
(Wikipedia)
Kotlin	is	built	on	JVM
Kotlin	is	built	on	JVM
- Can	call	Kotlin	code	from	Java.
Kotlin	is	built	on	JVM
- Can	call	Kotlin	code	from	Java.
- Can	call	Java	code	from	Kotlin.
Kotlin	Features
Type	Inference
val a: Int = 100
Type	Inference
val a: Int = 100
// b is implicit deduced to integer type
val b = 100
Type	Inference
val a: Int = 100
// b is implicit deduced to integer type
val b = 100
b = "Kotlin"
Type	Inference
val a: Int = 100
// b is implicit deduced to integer type
val b = 100
b = "Kotlin"
Null	Safety
Null	Safety
var a: String = "abc"
// compilation error
a = null
Null	Safety
var a: String = "abc"
// compilation error
a = null
var b: String? = "abc"
// ok
b = null
Null	Safety
var a: String = "abc"
// compilation error
a = null
var b: String? = "abc"
// ok
b = null
val l = a.length
Null	Safety
var a: String = "abc"
// compilation error
a = null
var b: String? = "abc"
// ok
b = null
val l = a.length
val l = b.length
Null	Safety
var a: String = "abc"
// compilation error
a = null
var b: String? = "abc"
// ok
b = null
val l = a.length
val l = b.length
val b:String? = null
if (b != null) {
// processing here
} else {
// b is null
}
val b:String? = null
if (b != null) {
// processing here
} else {
// b is null
}
b?.length
val b:String? = null
if (b != null) {
// processing here
} else {
// b is null
}
b?.length
b?.department?.head?.name
Kotlin	array	is	invariant
Covariance:										A	<	B			=>	T[A]	<	T[B]
Kotlin	array	is	invariant
Covariance:										A	<	B			=>	T[A]	<	T[B]
Contravariance:		A	<	B			=>	T[A]	>	T[B]
Kotlin	array	is	invariant
Covariance:										A	<	B			=>	T[A]	<	T[B]
Contravariance:		A	<	B			=>	T[A]	>	T[B]
Invariance:											nor	Covariance	or	Contravariance
Kotlin	array	is	invariant
Kotlin	array	is	invariant
Higher	Order	Function
Higher	Order	Function
fun request(url: String, work: (url: String) -> Int) {
println("prepare request")
val result = work(url)
println("finish with result code: $result")
}
Higher	Order	Function
fun request(url: String, work: (url: String) -> Int) {
println("prepare request")
val result = work(url)
println("finish with result code: $result")
}
Higher	Order	Function
fun request(url: String, work: (url: String) -> Int) {
println("prepare request")
val result = work(url)
println("finish with result code: $result")
}
request("www.google.com", { url ->
println("sending request to $url")
200
})
Higher	Order	Function
fun request(url: String, work: (url: String) -> Int) {
println("prepare request")
val result = work(url)
println("finish with result code: $result")
}
request("www.google.com", { url ->
println("sending request to $url")
200
})
prepare request
sending request to www.google.com
finish with result code: 200
Higher	Order	Function
val strings = mutableListOf("Google", "I/O", "Extended")
// Find all strings with length > 3 —> [Google, Extended]
strings.filter { it.length > 3 }.sortedBy { it }
Higher	Order	Function
val strings = mutableListOf("Google", "I/O", "Extended")
// sort ascending —> [Extended, Google]
strings.filter { it.length > 3 }.sortedBy { it }
Higher	Order	Function
val strings = mutableListOf("Google", "I/O", "Extended")
// convert to upper case —> [EXTENDED, GOOGLE]
strings.filter { it.length > 3 }.sortedBy { it }.map { it.toUpperCase() }
Higher	Order	Function
val strings = mutableListOf("Google", "I/O", "Extended")
strings.filter { it.length > 3 }.sortedBy { it }.map { it.toUpperCase() }
[EXTENDED, GOOGLE]
Higher	Order	Function
val strings = mutableListOf("Google", "I/O", "Extended")
strings.filter { it.length > 3 }.sortedBy { it }.map { it.toUpperCase() }
[EXTENDED, GOOGLE]
public inline fun <T> Iterable<T>.filter(predicate: (T) -> Boolean): List<T> {
return filterTo(ArrayList<T>(), predicate)
}
Higher	Order	Function
val strings = mutableListOf("Google", "I/O", "Extended")
strings.filter { it.length > 3 }.sortedBy { it }.map { it.toUpperCase() }
[EXTENDED, GOOGLE]
public inline fun <T> Iterable<T>. filter (predicate: (T) -> Boolean): List<T> {
return filterTo(ArrayList<T>(), predicate)
}
Extension	Function
val list = mutableListOf(1, 2, 3, 4, 5)
swap(list, 0, 1)
Extension	Function
fun swap(list: MutableList<Int>, firstIndex: Int, secondIndex: Int) {
val tmp = list[firstIndex]
list[firstIndex] = list[secondIndex]
list[secondIndex] = tmp
}
val list = mutableListOf(1, 2, 3, 4, 5)
swap(list, 0, 1)
Extension	Function
val list = mutableListOf(1, 2, 3, 4, 5)
list.swap(0, 1)
fun swap(list: MutableList<Int>, firstIndex: Int, secondIndex: Int) {
val tmp = list[firstIndex]
list[firstIndex] = list[secondIndex]
list[secondIndex] = tmp
}
val list = mutableListOf(1, 2, 3, 4, 5)
swap(list, 0, 1)
Extension	Function
val list = mutableListOf(1, 2, 3, 4, 5)
list.swap(0, 1)
Extension	Function
fun MutableList<Int>.swap(index1: Int, index2: Int) {
val tmp = this[index1]
this[index1] = this[index2]
this[index2] = tmp
}
val list = mutableListOf(1, 2, 3, 4, 5)
list.swap(0, 1)
Operator	Overloading
Operator	Overloading
class Point(xCoor: Float, yCoor: Float) {
val x = xCoor
val y = yCoor
operator fun plus(that: Point): Point = Point(x + that.x, y + that.y)
operator fun div(div: Int): Point = Point(x / div, y / div)
fun log() = println("($x,$y)")
}
Operator	Overloading
class Point(xCoor: Float, yCoor: Float) {
val x = xCoor
val y = yCoor
operator fun plus(that: Point): Point = Point(x + that.x, y + that.y)
operator fun div(div: Int): Point = Point(x / div, y / div)
fun log() = println("($x,$y)")
}
val firstPoint = Point(6f, 5f)
val secondPoint = Point(8f, 3f)
// (7.0, 4.0)
val midPoint = (firstPoint + secondPoint) / 2
midPoint.log()
Operator	Overloading
class Point(xCoor: Float, yCoor: Float) {
val x = xCoor
val y = yCoor
fun log() = println("($x,$y)")
}
Operator	Overloading
class Point(xCoor: Float, yCoor: Float) {
val x = xCoor
val y = yCoor
fun log() = println("($x,$y)")
}
operator fun Point.plus(that: Point): Point = Point(x + that.x, y + that.y)
operator fun Point.div(div: Int): Point = Point(x / div, y / div)
Operator	Overloading
class Point(xCoor: Float, yCoor: Float) {
val x = xCoor
val y = yCoor
fun log() = println("($x,$y)")
}
operator fun Point.plus(that: Point): Point = Point(x + that.x, y + that.y)
operator fun Point.div(div: Int): Point = Point(x / div, y / div)
val firstPoint = Point(6f, 5f)
val secondPoint = Point(8f, 3f)
// (7.0, 4.0)
val midPoint = (firstPoint + secondPoint) / 2
midPoint.log()
Reified	type	parameter
Reified	type	parameter
val items = listOf("one", 2, "three")
// print: [one, three]
println(items.filterIsInstance<String>())
public inline fun <reified R> Iterable<*>.filterIsInstance(): List<R> {
return filterIsInstanceTo(ArrayList<R>())
}
Reified	type	parameter
Intent i = new Intent(FirstActivity.this, SecondActivity.class);
startActivity(i);
Reified	type	parameter
Intent i = new Intent(FirstActivity.this, SecondActivity.class);
startActivity(i);
inline fun <reified T : Activity> Activity.startActivity() {
startActivity(Intent(this, T::class.java))
}
Reified	type	parameter
Intent i = new Intent(FirstActivity.this, SecondActivity.class);
startActivity(i);
inline fun <reified T : Activity> Activity.startActivity() {
startActivity(Intent(this, T::class.java))
}
startActivity<DetailActivity>()
Infix	Call	Function
class Point(xCoor: Float, yCoor: Float) {
val x = xCoor
val y = yCoor
fun multiply(k: Int) = Point(x * k, y * k)
}
val firstPoint = Point(6f, 5f)
firstPoint.multiply(3)
Infix	Call	Function
class Point(xCoor: Float, yCoor: Float) {
val x = xCoor
val y = yCoor
infix fun multiply(k: Int) = Point(x * k, y * k)
}
val firstPoint = Point(6f, 5f)
firstPoint.multiply(3)
Infix	Call	Function
class Point(xCoor: Float, yCoor: Float) {
val x = xCoor
val y = yCoor
infix fun multiply(k: Int) = Point(x * k, y * k)
}
val firstPoint = Point(6f, 5f)
firstPoint.multiply(3)
firstPoint multiply 3
DSL	- Domain	Specific	
Language
language	that's	written	to	deal	with	a	specific	domain	or	set	of	concerns.
- SQL	language
- Make	file
- Gradle	file
SELECT Country.name, COUNT(Customer.id) FROM Country
JOIN Customer
ON Country.id = Customer.country_id
GROUP BY Country.name
ORDER BY COUNT(Customer.id) DESC
LIMIT 1
Expose Library
SELECT Country.name, COUNT(Customer.id) FROM Country
JOIN Customer
ON Country.id = Customer.country_id
GROUP BY Country.name
ORDER BY COUNT(Customer.id) DESC
LIMIT 1
(Country join Customer)
.slice(Country.name, Count(Customer.id)).selectAll()
.groupBy(Country.name).orderBy(Count(Customer.id), isAsc = false).limit(1)
Expose Library
(Country join Customer)
.slice(Country.name, Count(Customer.id)).selectAll()
.groupBy(Country.name).orderBy(Count(Customer.id), isAsc = false).limit(1)
Customer.join(Country)
(Country join Customer)
.slice(Country.name, Count(Customer.id)).selectAll()
.groupBy(Country.name).orderBy(Count(Customer.id), isAsc = false).limit(1)
Customer join Country
(infix function)
(Country join Customer)
.slice(Country.name, Count(Customer.id)).selectAll()
.groupBy(Country.name).orderBy(Count(Customer.id), isAsc = false).limit(1)
Count: higher order function
(Country join Customer)
.slice(Country.name, Count(Customer.id)).selectAll()
.groupBy(Country.name).orderBy(Count(Customer.id), isAsc = false).limit(1)
isAsc = false: function with default argument
Integration	Kotlin	to	
Android
Prepare	Android	Studio
- Download	Android	Studio	3.0	beta
- Install	Kotlin	plugin	for	Android	Studio	2.x
Migrating	from	old	Project
Migrating	from	old	Project
Migrating	from	old	Project
Migrating	from	old	Project
Migrating	from	old	Project
Starting	from	scratch
Kotlin	&	Java	
Interoperability
Callling	Java	from	Kotlin
package com.hqt.model;
public class Customer {
private String firstName;
private String lastName;
private int age;
public Customer(String firstName, String lastName, int age) {
this.firstName = firstName;
this.lastName = lastName;
this.age = age;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
}
Callling	Java	from	Kotlin
package com.hqt.model;
public class Customer {
private String firstName;
private String lastName;
private int age;
public Customer(String firstName, String lastName, int age) {
this.firstName = firstName;
this.lastName = lastName;
this.age = age;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
} val customer = Customer("huynh", "thao", 3)
customer.firstName = "Huynh"
Callling	Java	from	Kotlin
Callling	Kotlin	from	Java
package com.hqt.kotlin
// Helper.kx
fun MutableList<Int>.swap(index1: Int, index2: Int) {
val tmp = this[index1]
this[index1] = this[index2]
this[index2] = tmp
}
val list = mutableListOf(1, 2, 3, 4, 5)
list.swap(0, 1)
Callling	Kotlin	from	Java
package com.hqt.kotlin
// Helper.kx
fun MutableList<Int>.swap(index1: Int, index2: Int) {
val tmp = this[index1]
this[index1] = this[index2]
this[index2] = tmp
}
List<Integer> list = Arrays.asList(1, 2, 3);
com.hqt.kotlin.HelperKt.swap(list, 0, 1);
val list = mutableListOf(1, 2, 3, 4, 5)
list.swap(0, 1)
Callling	Kotlin	from	Java
package com.hqt.kotlin
// Helper.kx
fun MutableList<Int>.swap(index1: Int, index2: Int) {
val tmp = this[index1]
this[index1] = this[index2]
this[index2] = tmp
}
List<Integer> list = Arrays.asList(1, 2, 3);
com.hqt.kotlin.HelperKt.swap(list, 0, 1);
val list = mutableListOf(1, 2, 3, 4, 5)
list.swap(0, 1)
Callling	Kotlin	from	Java
package com.hqt.kotlin
// Helper.kx
fun MutableList<Int>.swap(index1: Int, index2: Int) {
val tmp = this[index1]
this[index1] = this[index2]
this[index2] = tmp
}
List<Integer> list = Arrays.asList(1, 2, 3);
com.hqt.kotlin.HelperKt.swap(list, 0, 1);
val list = mutableListOf(1, 2, 3, 4, 5)
list.swap(0, 1)
Reference
Kotlin	in	Action
https://kotlinlang.org/docs/tutorials/
https://github.com/irontec/android-kotlin-samples
Q&A

More Related Content

What's hot

Functional aspects of java 8
Functional aspects of java 8Functional aspects of java 8
Functional aspects of java 8Jobaer Chowdhury
 
The Death of Final Tagless
The Death of Final TaglessThe Death of Final Tagless
The Death of Final TaglessJohn De Goes
 
Scalaz 8: A Whole New Game
Scalaz 8: A Whole New GameScalaz 8: A Whole New Game
Scalaz 8: A Whole New GameJohn De Goes
 
Scala + WattzOn, sitting in a tree....
Scala + WattzOn, sitting in a tree....Scala + WattzOn, sitting in a tree....
Scala + WattzOn, sitting in a tree....Raffi Krikorian
 
Refactoring Functional Type Classes
Refactoring Functional Type ClassesRefactoring Functional Type Classes
Refactoring Functional Type ClassesJohn De Goes
 
OOP is more than Cars and Dogs
OOP is more than Cars and Dogs OOP is more than Cars and Dogs
OOP is more than Cars and Dogs Chris Tankersley
 
Monad Transformers In The Wild
Monad Transformers In The WildMonad Transformers In The Wild
Monad Transformers In The WildStackMob Inc
 
Intro to Functional Programming
Intro to Functional ProgrammingIntro to Functional Programming
Intro to Functional ProgrammingJordan Parmer
 
Halogen: Past, Present, and Future
Halogen: Past, Present, and FutureHalogen: Past, Present, and Future
Halogen: Past, Present, and FutureJohn De Goes
 
Practical Functional Programming Presentation by Bogdan Hodorog
Practical Functional Programming Presentation by Bogdan HodorogPractical Functional Programming Presentation by Bogdan Hodorog
Practical Functional Programming Presentation by Bogdan Hodorog3Pillar Global
 
PHP 8: What's New and Changed
PHP 8: What's New and ChangedPHP 8: What's New and Changed
PHP 8: What's New and ChangedAyesh Karunaratne
 
Perl Teach-In (part 2)
Perl Teach-In (part 2)Perl Teach-In (part 2)
Perl Teach-In (part 2)Dave Cross
 
Functional Programming with JavaScript
Functional Programming with JavaScriptFunctional Programming with JavaScript
Functional Programming with JavaScriptAung Baw
 
SeaJUG March 2004 - Groovy
SeaJUG March 2004 - GroovySeaJUG March 2004 - Groovy
SeaJUG March 2004 - GroovyTed Leung
 
Functor, Apply, Applicative And Monad
Functor, Apply, Applicative And MonadFunctor, Apply, Applicative And Monad
Functor, Apply, Applicative And MonadOliver Daff
 
The Design of the Scalaz 8 Effect System
The Design of the Scalaz 8 Effect SystemThe Design of the Scalaz 8 Effect System
The Design of the Scalaz 8 Effect SystemJohn De Goes
 
Scalaz 8 vs Akka Actors
Scalaz 8 vs Akka ActorsScalaz 8 vs Akka Actors
Scalaz 8 vs Akka ActorsJohn De Goes
 

What's hot (20)

Polyglot Grails
Polyglot GrailsPolyglot Grails
Polyglot Grails
 
Functional aspects of java 8
Functional aspects of java 8Functional aspects of java 8
Functional aspects of java 8
 
The Death of Final Tagless
The Death of Final TaglessThe Death of Final Tagless
The Death of Final Tagless
 
ZIO Queue
ZIO QueueZIO Queue
ZIO Queue
 
Scalaz 8: A Whole New Game
Scalaz 8: A Whole New GameScalaz 8: A Whole New Game
Scalaz 8: A Whole New Game
 
Scala + WattzOn, sitting in a tree....
Scala + WattzOn, sitting in a tree....Scala + WattzOn, sitting in a tree....
Scala + WattzOn, sitting in a tree....
 
Joy of scala
Joy of scalaJoy of scala
Joy of scala
 
Refactoring Functional Type Classes
Refactoring Functional Type ClassesRefactoring Functional Type Classes
Refactoring Functional Type Classes
 
OOP is more than Cars and Dogs
OOP is more than Cars and Dogs OOP is more than Cars and Dogs
OOP is more than Cars and Dogs
 
Monad Transformers In The Wild
Monad Transformers In The WildMonad Transformers In The Wild
Monad Transformers In The Wild
 
Intro to Functional Programming
Intro to Functional ProgrammingIntro to Functional Programming
Intro to Functional Programming
 
Halogen: Past, Present, and Future
Halogen: Past, Present, and FutureHalogen: Past, Present, and Future
Halogen: Past, Present, and Future
 
Practical Functional Programming Presentation by Bogdan Hodorog
Practical Functional Programming Presentation by Bogdan HodorogPractical Functional Programming Presentation by Bogdan Hodorog
Practical Functional Programming Presentation by Bogdan Hodorog
 
PHP 8: What's New and Changed
PHP 8: What's New and ChangedPHP 8: What's New and Changed
PHP 8: What's New and Changed
 
Perl Teach-In (part 2)
Perl Teach-In (part 2)Perl Teach-In (part 2)
Perl Teach-In (part 2)
 
Functional Programming with JavaScript
Functional Programming with JavaScriptFunctional Programming with JavaScript
Functional Programming with JavaScript
 
SeaJUG March 2004 - Groovy
SeaJUG March 2004 - GroovySeaJUG March 2004 - Groovy
SeaJUG March 2004 - Groovy
 
Functor, Apply, Applicative And Monad
Functor, Apply, Applicative And MonadFunctor, Apply, Applicative And Monad
Functor, Apply, Applicative And Monad
 
The Design of the Scalaz 8 Effect System
The Design of the Scalaz 8 Effect SystemThe Design of the Scalaz 8 Effect System
The Design of the Scalaz 8 Effect System
 
Scalaz 8 vs Akka Actors
Scalaz 8 vs Akka ActorsScalaz 8 vs Akka Actors
Scalaz 8 vs Akka Actors
 

Similar to Kotlin Introduction with Android applications

Real life-coffeescript
Real life-coffeescriptReal life-coffeescript
Real life-coffeescriptDavid Furber
 
Why Java Sucks and C# Rocks (Final)
Why Java Sucks and C# Rocks (Final)Why Java Sucks and C# Rocks (Final)
Why Java Sucks and C# Rocks (Final)jeffz
 
JavaOne 2013: Java 8 - The Good Parts
JavaOne 2013: Java 8 - The Good PartsJavaOne 2013: Java 8 - The Good Parts
JavaOne 2013: Java 8 - The Good PartsKonrad Malawski
 
CPP-overviews notes variable data types notes
CPP-overviews notes variable data types notesCPP-overviews notes variable data types notes
CPP-overviews notes variable data types notesSukhpreetSingh519414
 
cppt-170218053903 (1).pptx
cppt-170218053903 (1).pptxcppt-170218053903 (1).pptx
cppt-170218053903 (1).pptxWatchDog13
 
JavaScript / Web Engineering / Web Development / html + css + js/presentation
JavaScript / Web Engineering / Web Development / html + css + js/presentationJavaScript / Web Engineering / Web Development / html + css + js/presentation
JavaScript / Web Engineering / Web Development / html + css + js/presentationM Sajid R
 
eMan Dev Meetup: Kotlin - A Language we should know it exists (part 02/03) 18...
eMan Dev Meetup: Kotlin - A Language we should know it exists (part 02/03) 18...eMan Dev Meetup: Kotlin - A Language we should know it exists (part 02/03) 18...
eMan Dev Meetup: Kotlin - A Language we should know it exists (part 02/03) 18...eMan s.r.o.
 
Deep Dive Into Swift
Deep Dive Into SwiftDeep Dive Into Swift
Deep Dive Into SwiftSarath C
 
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfpragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfHiroshi Ono
 
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfpragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfHiroshi Ono
 
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfpragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfHiroshi Ono
 
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfpragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfHiroshi Ono
 
Android & Kotlin - The code awakens #03
Android & Kotlin - The code awakens #03Android & Kotlin - The code awakens #03
Android & Kotlin - The code awakens #03Omar Miatello
 
Introduction to CoffeeScript
Introduction to CoffeeScriptIntroduction to CoffeeScript
Introduction to CoffeeScriptStalin Thangaraj
 
JavaScript(Es5) Interview Questions & Answers
JavaScript(Es5)  Interview Questions & AnswersJavaScript(Es5)  Interview Questions & Answers
JavaScript(Es5) Interview Questions & AnswersRatnala Charan kumar
 

Similar to Kotlin Introduction with Android applications (20)

Scala in Places API
Scala in Places APIScala in Places API
Scala in Places API
 
Real life-coffeescript
Real life-coffeescriptReal life-coffeescript
Real life-coffeescript
 
Scala introduction
Scala introductionScala introduction
Scala introduction
 
Why Java Sucks and C# Rocks (Final)
Why Java Sucks and C# Rocks (Final)Why Java Sucks and C# Rocks (Final)
Why Java Sucks and C# Rocks (Final)
 
Scala ntnu
Scala ntnuScala ntnu
Scala ntnu
 
Java 8: the good parts!
Java 8: the good parts!Java 8: the good parts!
Java 8: the good parts!
 
JavaOne 2013: Java 8 - The Good Parts
JavaOne 2013: Java 8 - The Good PartsJavaOne 2013: Java 8 - The Good Parts
JavaOne 2013: Java 8 - The Good Parts
 
CPP-overviews notes variable data types notes
CPP-overviews notes variable data types notesCPP-overviews notes variable data types notes
CPP-overviews notes variable data types notes
 
cppt-170218053903 (1).pptx
cppt-170218053903 (1).pptxcppt-170218053903 (1).pptx
cppt-170218053903 (1).pptx
 
JavaScript / Web Engineering / Web Development / html + css + js/presentation
JavaScript / Web Engineering / Web Development / html + css + js/presentationJavaScript / Web Engineering / Web Development / html + css + js/presentation
JavaScript / Web Engineering / Web Development / html + css + js/presentation
 
eMan Dev Meetup: Kotlin - A Language we should know it exists (part 02/03) 18...
eMan Dev Meetup: Kotlin - A Language we should know it exists (part 02/03) 18...eMan Dev Meetup: Kotlin - A Language we should know it exists (part 02/03) 18...
eMan Dev Meetup: Kotlin - A Language we should know it exists (part 02/03) 18...
 
Deep Dive Into Swift
Deep Dive Into SwiftDeep Dive Into Swift
Deep Dive Into Swift
 
Wakanday JS201 Best Practices
Wakanday JS201 Best PracticesWakanday JS201 Best Practices
Wakanday JS201 Best Practices
 
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfpragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
 
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfpragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
 
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfpragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
 
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfpragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
 
Android & Kotlin - The code awakens #03
Android & Kotlin - The code awakens #03Android & Kotlin - The code awakens #03
Android & Kotlin - The code awakens #03
 
Introduction to CoffeeScript
Introduction to CoffeeScriptIntroduction to CoffeeScript
Introduction to CoffeeScript
 
JavaScript(Es5) Interview Questions & Answers
JavaScript(Es5)  Interview Questions & AnswersJavaScript(Es5)  Interview Questions & Answers
JavaScript(Es5) Interview Questions & Answers
 

More from Thao Huynh Quang

2021-03-08-telegram-vs-signal.pdf
2021-03-08-telegram-vs-signal.pdf2021-03-08-telegram-vs-signal.pdf
2021-03-08-telegram-vs-signal.pdfThao Huynh Quang
 
Consensus and Raft Algorithm in Distributed System
Consensus and  Raft Algorithm in Distributed SystemConsensus and  Raft Algorithm in Distributed System
Consensus and Raft Algorithm in Distributed SystemThao Huynh Quang
 
Consensus and Raft algorithm (Vietnamese version)
Consensus and Raft algorithm (Vietnamese version)Consensus and Raft algorithm (Vietnamese version)
Consensus and Raft algorithm (Vietnamese version)Thao Huynh Quang
 
Git Introduction with illustrations
Git Introduction with illustrationsGit Introduction with illustrations
Git Introduction with illustrationsThao Huynh Quang
 
Android Jetpack: Room persistence library
Android Jetpack: Room persistence libraryAndroid Jetpack: Room persistence library
Android Jetpack: Room persistence libraryThao Huynh Quang
 
Kubernetes and service mesh application
Kubernetes  and service mesh applicationKubernetes  and service mesh application
Kubernetes and service mesh applicationThao Huynh Quang
 
Kafka: All an engineer needs to know
Kafka: All an engineer needs to knowKafka: All an engineer needs to know
Kafka: All an engineer needs to knowThao Huynh Quang
 
Concurrency pattern in Kotlin
Concurrency pattern in KotlinConcurrency pattern in Kotlin
Concurrency pattern in KotlinThao Huynh Quang
 
Observability and its application
Observability and its applicationObservability and its application
Observability and its applicationThao Huynh Quang
 
Android Reverse Engineering
Android Reverse EngineeringAndroid Reverse Engineering
Android Reverse EngineeringThao Huynh Quang
 

More from Thao Huynh Quang (16)

2021-03-08-telegram-vs-signal.pdf
2021-03-08-telegram-vs-signal.pdf2021-03-08-telegram-vs-signal.pdf
2021-03-08-telegram-vs-signal.pdf
 
Consensus and Raft Algorithm in Distributed System
Consensus and  Raft Algorithm in Distributed SystemConsensus and  Raft Algorithm in Distributed System
Consensus and Raft Algorithm in Distributed System
 
Consensus and Raft algorithm (Vietnamese version)
Consensus and Raft algorithm (Vietnamese version)Consensus and Raft algorithm (Vietnamese version)
Consensus and Raft algorithm (Vietnamese version)
 
Git Introduction with illustrations
Git Introduction with illustrationsGit Introduction with illustrations
Git Introduction with illustrations
 
Android Jetpack: Room persistence library
Android Jetpack: Room persistence libraryAndroid Jetpack: Room persistence library
Android Jetpack: Room persistence library
 
Android Performance Tips
Android Performance TipsAndroid Performance Tips
Android Performance Tips
 
Kubernetes and service mesh application
Kubernetes  and service mesh applicationKubernetes  and service mesh application
Kubernetes and service mesh application
 
Kafka: All an engineer needs to know
Kafka: All an engineer needs to knowKafka: All an engineer needs to know
Kafka: All an engineer needs to know
 
Blockchain introduction
Blockchain introductionBlockchain introduction
Blockchain introduction
 
Concurrency pattern in Kotlin
Concurrency pattern in KotlinConcurrency pattern in Kotlin
Concurrency pattern in Kotlin
 
Observability and its application
Observability and its applicationObservability and its application
Observability and its application
 
GraphQL in Android
GraphQL in AndroidGraphQL in Android
GraphQL in Android
 
Android GRPC
Android GRPCAndroid GRPC
Android GRPC
 
Android Reverse Engineering
Android Reverse EngineeringAndroid Reverse Engineering
Android Reverse Engineering
 
nosql
nosqlnosql
nosql
 
android deep linking
android deep linkingandroid deep linking
android deep linking
 

Recently uploaded

New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024BookNet Canada
 
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc
 
Top 10 Hubspot Development Companies in 2024
Top 10 Hubspot Development Companies in 2024Top 10 Hubspot Development Companies in 2024
Top 10 Hubspot Development Companies in 2024TopCSSGallery
 
Glenn Lazarus- Why Your Observability Strategy Needs Security Observability
Glenn Lazarus- Why Your Observability Strategy Needs Security ObservabilityGlenn Lazarus- Why Your Observability Strategy Needs Security Observability
Glenn Lazarus- Why Your Observability Strategy Needs Security Observabilityitnewsafrica
 
Modern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
Modern Roaming for Notes and Nomad – Cheaper Faster Better StrongerModern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
Modern Roaming for Notes and Nomad – Cheaper Faster Better Strongerpanagenda
 
A Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersA Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersNicole Novielli
 
Varsha Sewlal- Cyber Attacks on Critical Critical Infrastructure
Varsha Sewlal- Cyber Attacks on Critical Critical InfrastructureVarsha Sewlal- Cyber Attacks on Critical Critical Infrastructure
Varsha Sewlal- Cyber Attacks on Critical Critical Infrastructureitnewsafrica
 
Data governance with Unity Catalog Presentation
Data governance with Unity Catalog PresentationData governance with Unity Catalog Presentation
Data governance with Unity Catalog PresentationKnoldus Inc.
 
UiPath Community: Communication Mining from Zero to Hero
UiPath Community: Communication Mining from Zero to HeroUiPath Community: Communication Mining from Zero to Hero
UiPath Community: Communication Mining from Zero to HeroUiPathCommunity
 
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...Alkin Tezuysal
 
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...Wes McKinney
 
Bridging Between CAD & GIS: 6 Ways to Automate Your Data Integration
Bridging Between CAD & GIS:  6 Ways to Automate Your Data IntegrationBridging Between CAD & GIS:  6 Ways to Automate Your Data Integration
Bridging Between CAD & GIS: 6 Ways to Automate Your Data Integrationmarketing932765
 
TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024Lonnie McRorey
 
The Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsThe Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsPixlogix Infotech
 
Genislab builds better products and faster go-to-market with Lean project man...
Genislab builds better products and faster go-to-market with Lean project man...Genislab builds better products and faster go-to-market with Lean project man...
Genislab builds better products and faster go-to-market with Lean project man...Farhan Tariq
 
Time Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsTime Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsNathaniel Shimoni
 
Abdul Kader Baba- Managing Cybersecurity Risks and Compliance Requirements i...
Abdul Kader Baba- Managing Cybersecurity Risks  and Compliance Requirements i...Abdul Kader Baba- Managing Cybersecurity Risks  and Compliance Requirements i...
Abdul Kader Baba- Managing Cybersecurity Risks and Compliance Requirements i...itnewsafrica
 
2024 April Patch Tuesday
2024 April Patch Tuesday2024 April Patch Tuesday
2024 April Patch TuesdayIvanti
 
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxPasskey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxLoriGlavin3
 
MuleSoft Online Meetup Group - B2B Crash Course: Release SparkNotes
MuleSoft Online Meetup Group - B2B Crash Course: Release SparkNotesMuleSoft Online Meetup Group - B2B Crash Course: Release SparkNotes
MuleSoft Online Meetup Group - B2B Crash Course: Release SparkNotesManik S Magar
 

Recently uploaded (20)

New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
 
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
 
Top 10 Hubspot Development Companies in 2024
Top 10 Hubspot Development Companies in 2024Top 10 Hubspot Development Companies in 2024
Top 10 Hubspot Development Companies in 2024
 
Glenn Lazarus- Why Your Observability Strategy Needs Security Observability
Glenn Lazarus- Why Your Observability Strategy Needs Security ObservabilityGlenn Lazarus- Why Your Observability Strategy Needs Security Observability
Glenn Lazarus- Why Your Observability Strategy Needs Security Observability
 
Modern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
Modern Roaming for Notes and Nomad – Cheaper Faster Better StrongerModern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
Modern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
 
A Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersA Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software Developers
 
Varsha Sewlal- Cyber Attacks on Critical Critical Infrastructure
Varsha Sewlal- Cyber Attacks on Critical Critical InfrastructureVarsha Sewlal- Cyber Attacks on Critical Critical Infrastructure
Varsha Sewlal- Cyber Attacks on Critical Critical Infrastructure
 
Data governance with Unity Catalog Presentation
Data governance with Unity Catalog PresentationData governance with Unity Catalog Presentation
Data governance with Unity Catalog Presentation
 
UiPath Community: Communication Mining from Zero to Hero
UiPath Community: Communication Mining from Zero to HeroUiPath Community: Communication Mining from Zero to Hero
UiPath Community: Communication Mining from Zero to Hero
 
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...
 
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...
 
Bridging Between CAD & GIS: 6 Ways to Automate Your Data Integration
Bridging Between CAD & GIS:  6 Ways to Automate Your Data IntegrationBridging Between CAD & GIS:  6 Ways to Automate Your Data Integration
Bridging Between CAD & GIS: 6 Ways to Automate Your Data Integration
 
TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024
 
The Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsThe Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and Cons
 
Genislab builds better products and faster go-to-market with Lean project man...
Genislab builds better products and faster go-to-market with Lean project man...Genislab builds better products and faster go-to-market with Lean project man...
Genislab builds better products and faster go-to-market with Lean project man...
 
Time Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsTime Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directions
 
Abdul Kader Baba- Managing Cybersecurity Risks and Compliance Requirements i...
Abdul Kader Baba- Managing Cybersecurity Risks  and Compliance Requirements i...Abdul Kader Baba- Managing Cybersecurity Risks  and Compliance Requirements i...
Abdul Kader Baba- Managing Cybersecurity Risks and Compliance Requirements i...
 
2024 April Patch Tuesday
2024 April Patch Tuesday2024 April Patch Tuesday
2024 April Patch Tuesday
 
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxPasskey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
 
MuleSoft Online Meetup Group - B2B Crash Course: Release SparkNotes
MuleSoft Online Meetup Group - B2B Crash Course: Release SparkNotesMuleSoft Online Meetup Group - B2B Crash Course: Release SparkNotes
MuleSoft Online Meetup Group - B2B Crash Course: Release SparkNotes
 

Kotlin Introduction with Android applications