SlideShare a Scribd company logo
for Android Developers
Contents
• Intro
• Hello, Kotlin!
• What Kotlin Adds to Java
• Kotlin Android Extensions
• Android Kotlin extensions “KTX”
Background
• Apple got a nice(r) new language
• Android stuck with Java
• Not fair!
Java is not just about Java
"Most people talk about Java the language, and this
may sound odd `coming from me, but I could hardly
care less. At the core of the Java ecosystem is the JVM."
James Gosling, Creator of the Java Programming Language(2011,
TheServerSide.com)
What's Right with Java?
• The JVM runs on virtually every platform - from your
credit card to the largest mainframe
• Cross platform compatibility has been a hallmark of Java
from the very beginning
• Huge investment in a highly stable and performant
runtime
• Many important and large systems are written in Java
• The open source movement flourished with Java
• Many important architectural concepts in use today
have come from the Java/Open Source space
What's Wrong with Java?
• Many Java code bases are unmitigated disasters
• Many Java developers are undisciplined hacks
• Enterprise systems - EJBs, WebSphere, etc.
• The Java language suffered from years of inattention
• Java 8 is great, but very late and many clients have not upgraded
• Missing modern features
Lambdas, properties, higher-order functions
• Null safety
NullPointerException
Java is a good language...there are some issues...you can make things as God awful
as you want... it does allow people to create incredible messes (Gosling)
Java on Android - the bad parts
• Java 7 was out 2011. - partial support 2013.
• Java 8 was out 2014. - support will announced in the
near future
• Null references
• Covariant arrays
• Raw types
• No Lambda expressions
• Checked exceptions
Other JVM Languages
• Groovy (Dynamic) - Pivotal donated to Apache
where projects go to die
• Clojure (Lisp on JVM)
• Scala (static types, functional, ML on the JVM)
• Kotlin
• Dozens more
Kotlin Milestones
• Project Kotlin unveiled in July 2011
• Kotlin 1.0 released in February 2016
• “Language of the Month” - Dr. Dobb’s Journal (01/2012)
Motivation
• Huge Java codebase (>50k classes, 10 years old)
• Building tools for many nice languages
• Want a modern, expressive language …that’s
easy to introduce in the existing environment
• Need efficient tooling
• None of the existing languages was a good fit
Why Kotlin?
• Kotlin is not an academic language - it is practical
• Kotlin does not make you change the way you think
(unlike Scala and Clojure)
• Seamless Java interop (the killer feature)
• Makes Android development less painful (Android is
the killer app for Kotlin)
• JDK 6!
Building Kotlin
• Same structure as Java - packages, classes, etc.
• Builds with Maven/Gradle/Ant
• Java and Kotlin can live side by side in the same
project
Kotlin Language Features
• Semicolons are optional and discouraged
• Multiple classes in files
• Very relaxed about classes, file names, etc.
• Codifies many conventions leading to more concise code
• Type inference
• Lambdas before Java 8
• Null Safety
• Domain-Specific Languages “DSL” Construction
Advantages of Kotlin
• Modern statically typed, object oriented language that
borrows manyideas from functional languages
• Fast learning curve - inspired by Scala and C#
• Meant to be used for building large software systems
• Engineered to be highly interoperable with Java - you
can use existing code base w/o (many) problems
Advantages of Kotlin cont.
• The team behind it is JetBrains, creators of IntelliJ which is Android Studio
based on. Also has some contributions from James Strachan - creator of
Groovy
• Significantly more concise and readable than Java, which means it’s
easier to maintain
• Lightweight - Kotlin stdlib has 8k methods
• If it means something to someone - it also compiles to Javascript
Dalvik ART
Android
Java source
javac
Kotlin source
kotlinc
bytecode
JVM
Backend
JVM
Desktop
You Can Have Java & Kotlin Code In One
Project
Kotlin code
Java code
Just another library for your app
rxjava-2.1.2
kotlin-stdlib-1.1.4 6315
10212
No Kotlin SDK
…just JDK + extensions
small runtime jar easy Java interop
Gradle & Kotlin
Writing Gradle build scripts
and plugins in Kotlin
try.kotlinlang.org
Java Kotlin
public class PersonInJava {
private int id;
private String name;
public PersonInJava(int id, String name) {
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
PersonInJava that = (PersonInJava) o;
if (id != that.id) return false;
return name.equals(that.name);
}
@Override
public int hashCode() {
int result = id;
result = 31 * result + name.hashCode();
return result;
}
}
data class PersonInKotlin (var id: Int, var name:String)
Less code means less Bugs
Hello, Kotlin!
fun main(args: Array<String>): Unit {
println("Hello, World!")
}
> Hello, World!
fun main(args: Array<String>): Unit {
println("Hello, World!")
}
Function keyword
fun main(args: Array<String>): Unit {
println("Hello, World!")
}
Function name
fun main(args: Array<String>): Unit {
println("Hello, World!")
}
Argumentname
fun main(args: Array<String>): Unit {
println("Hello, World!")
}
Argumenttype
fun main(args: Array<String>): Unit {
println("Hello, World!")
}
Return type
fun main(args: Array<String>): Unit {
println("Hello, World!")
}
fun main(args: Array<String>): Unit {
println("Hello, World!")
}
Unit inferred
fun main(args: Array<String>) {
println("Hello, World!")
}
fun main(args: Array<String>) {
println("Hello, World!")
}
fun main(args: Array<String>) {
var name = "World"
println("Hello, $name!")
}
fun main(args: Array<String>) {
var name = "World"
println("Hello, $name!")
}
Variable declaration
fun main(args: Array<String>) {
var name = "World“
println("Hello, $name!")
}
String interpolation
fun main(args: Array<String>) {
var name = "World"
if (args.isNotEmpty()) {
name = args[0]
}
println("Hello, $name!")
}
fun main(args: Array<String>) {
var name = "World"
if (args.isNotEmpty()) {
name = args[0]
}
println("Hello, $name!")
}
fun main(args: Array<String>) {
val name = "World"
if (args.isNotEmpty()) {
name = args[0]
}
println("Hello, $name!")
}
fun main(args: Array<String>) {
val name = "World"
if (args.isNotEmpty()) {
name = args[0]
}
println("Hello, $name!")
}
Constant declaration
fun main(args: Array<String>) {
val name = "World"
if (args.isNotEmpty()) {
name = args[0]
}
println("Hello, $name!")
}
Val cannot be reassigned
fun main(args: Array<String>) {
val name = "World"
if (args.isNotEmpty()) {
name = args[0]
}
println("Hello, $name!")
}
fun main(args: Array<String>) {
val name = if (args.isNotEmpty()) {
args[0]
} else {
"World"
}
println("Hello, $name!")
}
fun main(args: Array<String>) {
val name = if (args.isNotEmpty()) {
args[0]
} else {
"World"
}
println("Hello, $name!")
}
fun main(args: Array<String>) {
val name = if (args.isNotEmpty()) {
args[0]
} else {
"World"
}
println("Hello, $name!")
}
Conditional assignment block
fun main(args: Array<String>) {
val name = if (args.isNotEmpty()) { args[0] } else { "World" }
println("Hello, $name!")
}
fun main(args: Array<String>) {
val name = if (args.isNotEmpty()) args[0] else "World"
println("Hello, $name!")
}
class Person(var name: String)
fun main(args: Array<String>) {
val name = if (args.isNotEmpty()) args[0] else "World"
println("Hello, $name!")
}
class Person(var name: String)
fun main(args: Array<String>) {
val name = if (args.isNotEmpty()) args[0] else "World"
println("Hello, $name!")
}
Class keyword
class Person(var name: String)
fun main(args: Array<String>) {
val name = if (args.isNotEmpty()) args[0] else "World"
println("Hello, $name!")
}
Class name
class Person(var name: String)
fun main(args: Array<String>) {
val name = if (args.isNotEmpty()) args[0] else "World"
println("Hello, $name!")
}
Primaryconstructor
class Person(var name: String)
fun main(args: Array<String>) {
val name = if (args.isNotEmpty()) args[0] else "World"
println("Hello, $name!")
}
Non-final classmember
class Person(var name: String)
fun main(args: Array<String>) {
val name = if (args.isNotEmpty()) args[0] else "World"
println("Hello, $name!")
}
class Person(var name: String)
fun main(args: Array<String>) {
println("Hello, $name!")
}
class Person(var name: String)
fun main(args: Array<String>) {
val person = Person("Michael")
println("Hello, $name!")
}
class Person(var name: String)
fun main(args: Array<String>) {
val person = Person("Michael")
println("Hello, $name!")
}
Instance declaration
class Person(var name: String)
fun main(args: Array<String>) {
val person = Person("Michael")
println("Hello, $name!")
}
class Person(var name: String)
fun main(args: Array<String>) {
val person = Person("Michael")
println("Hello, ${person.name}!")
}
> Hello, Michael!
enum class Language(val greeting: String) {
EN("Hello"), ES("Hola"), FR("Bonjour")
}
class Person(var name: String)
fun main(args: Array<String>) {
val person = Person("Michael")
println("Hello, ${person.name}!")
}
enum class Language(val greeting: String) {
EN("Hello"), ES("Hola"), FR("Bonjour")
}
class Person(var name: String)
fun main(args: Array<String>) {
val person = Person("Michael")
println("Hello, ${person.name}!")
}
enum class Language(val greeting: String) {
EN("Hello"), ES("Hola"), FR("Bonjour")
}
class Person(var name: String, var lang: Language)
fun main(args: Array<String>) {
val person = Person("Michael")
println("Hello, ${person.name}!")
}
enum class Language(val greeting: String) {
EN("Hello"), ES("Hola"), FR("Bonjour")
}
class Person(var name: String, var lang: Language = Language.EN)
fun main(args: Array<String>) {
val person = Person("Michael")
println("Hello, ${person.name}!")
}
Defaultvalue
enum class Language(val greeting: String) {
EN("Hello"), ES("Hola"), FR("Bonjour")
}
class Person(var name: String, var lang: Language = Language.EN)
fun main(args: Array<String>) {
val person = Person("Michael")
println("Hello, ${person.name}!")
}
enum class Language(val greeting: String) {
EN("Hello"), ES("Hola"), FR("Bonjour")
}
class Person(var name: String, var lang: Language = Language.EN) {
fun greet() = println("${lang.greeting}, $name!")
}
fun main(args: Array<String>) {
val person = Person("Michael")
println("Hello, ${person.name}!")
}
enum class Language(val greeting: String) {
EN("Hello"), ES("Hola"), FR("Bonjour")
}
class Person(var name: String, var lang: Language = Language.EN) {
fun greet() = println("${lang.greeting}, $name!")
}
fun main(args: Array<String>) {
val person = Person("Michael")
println("Hello, ${person.name}!")
}
enum class Language(val greeting: String) {
EN("Hello"), ES("Hola"), FR("Bonjour")
}
class Person(var name: String, var lang: Language = Language.EN) {
fun greet() = println("${lang.greeting}, $name!")
}
fun main(args: Array<String>) {
val person = Person("Michael")
}
enum class Language(val greeting: String) {
EN("Hello"), ES("Hola"), FR("Bonjour")
}
class Person(var name: String, var lang: Language = Language.EN) {
fun greet() = println("${lang.greeting}, $name!")
}
fun main(args: Array<String>) {
val person = Person("Michael")
person.greet()
}
> Hello, Michael!
enum class Language(val greeting: String) {
EN("Hello"), ES("Hola"), FR("Bonjour")
}
class Person(var name: String, var lang: Language = Language.EN) {
fun greet() = println("${lang.greeting}, $name!")
}
fun main(args: Array<String>) {
}
enum class Language(val greeting: String) {
EN("Hello"), ES("Hola"), FR("Bonjour")
}
class Person(var name: String, var lang: Language = Language.EN) {
fun greet() = println("${lang.greeting}, $name!")
}
fun main(args: Array<String>) {
val people = listOf(
Person("Michael"),
Person("Miguel", Language.SP),
Person("Michelle", Language.FR)
)
}
enum class Language(val greeting: String) {
EN("Hello"), ES("Hola"), FR("Bonjour")
}
class Person(var name: String, var lang: Language = Language.EN) {
fun greet() = println("${lang.greeting}, $name!")
}
fun main(args: Array<String>) {
val people = listOf(
Person("Michael"),
Person("Miguel", Language.SP),
Person("Michelle", Language.FR)
)
for (person in people) {
person.greet()
}
}
enum class Language(val greeting: String) {
EN("Hello"), ES("Hola"), FR("Bonjour")
}
class Person(var name: String, var lang: Language = Language.EN) {
fun greet() = println("${lang.greeting}, $name!")
}
fun main(args: Array<String>) {
val people = listOf(
Person("Michael"),
Person("Miguel", Language.SP),
Person("Michelle", Language.FR)
)
people.forEach { person ->
person.greet()
}
}
enum class Language(val greeting: String) {
EN("Hello"), ES("Hola"), FR("Bonjour")
}
class Person(var name: String, var lang: Language = Language.EN) {
fun greet() = println("${lang.greeting}, $name!")
}
fun main(args: Array<String>) {
val people = listOf(
Person("Michael"),
Person("Miguel", Language.SP),
Person("Michelle", Language.FR)
)
people.forEach { it.greet() }
}
enum class Language(val greeting: String) {
EN("Hello"), ES("Hola"), FR("Bonjour")
}
class Person(var name: String, var lang: Language = Language.EN) {
fun greet() = println("${lang.greeting}, $name!")
}
fun main(args: Array<String>) {
listOf(
Person("Michael"),
Person("Miguel", Language.SP),
Person("Michelle", Language.FR)
).forEach { it.greet() }
}
> Hello, Michael!
> Hola, Miguel!
> Bonjour, Michelle!
enum class Language(val greeting: String) {
EN("Hello"), ES("Hola"), FR("Bonjour")
}
open class Person(var name: String, var lang: Language = Language.EN) {
fun greet() = println("${lang.greeting}, $name!")
}
fun main(args: Array<String>) {
listOf(
Person("Michael"),
Person("Miguel", Language.SP),
Person("Michelle", Language.FR)
).forEach { it.greet() }.
}
Non-final
enum class Language(val greeting: String) {
EN("Hello"), ES("Hola"), FR("Bonjour")
}
open class Person(var name: String, var lang: Language = Language.EN) {
fun greet() = println("${lang.greeting}, $name!")
}
class Hispanophone(name: String) : Person(name, Language.ES)
class Francophone(name: String) : Person(name, Language.FR)
fun main(args: Array<String>) {
listOf(
Person("Michael"),
Person("Miguel", Language.SP),
Person("Michelle", Language.FR)
).forEach { it.greet() }
}
Inheritance
enum class Language(val greeting: String) {
EN("Hello"), ES("Hola"), FR("Bonjour")
}
open class Person(var name: String, var lang: Language = Language.EN) {
fun greet() = println("${lang.greeting}, $name!")
}
class Hispanophone(name: String) : Person(name, Language.ES)
class Francophone(name: String) : Person(name, Language.FR)
fun main(args: Array<String>) {
listOf(
Person("Michael"),
Hispanophone("Miguel"),
Francophone("Michelle")
).forEach { it.greet() }
}
enum class Language(val greeting: String) {
EN("Hello"), ES("Hola"), FR("Bonjour")
}
open class Person(var name: String, var lang: Language = Language.EN) {
fun greet() = println("${lang.greeting}, $name!")
}
class Hispanophone(name: String) : Person(name, Language.ES)
class Francophone(name: String) : Person(name, Language.FR)
fun main(args: Array<String>) {
listOf(
Person("Michael"),
Hispanophone("Miguel"),
Francophone("Michelle")
).forEach { it.greet() }
}
What Kotlin Adds to Java
Type inference
Type inference
String string = "";
Type inference
var string: String = ""
Type inference
var string = ""
Type inference
var string = ""
Var char = ' '
Type inference
var string = ""
var char = ' '
var int = 0
Type inference
var string = ""
var char = ' '
var int = 0
var long = 0L
Type inference
var string = ""
var char = ' '
var int = 0
var long = 0L
var float = 0F
Type inference
var int = 0
var long = 0L
var float = 0F
var double = 0.0
var string = ""
var char = ' '
Type inference
var string = ""
var char = ' '
var int = 0
var long = 0L
var float = 0F
var double = 0.0
var boolean = true
Type inference
var string = ""
var char = ' '
var int = 0
var long = 0L
var float = 0F
var double = 0.0
var boolean = true
var foo = MyFooType()
Null-safety
Null-safety
String a = null;
Null-safety
String a = null;
System.out.println(a.length());
Null-safety
String a = null;
System.out.println(a.length());
NullPointerException
Null-safety
val a: String = null
Null-safety
val a: String = null
Non-null type
Null-safety
val a: String? = null
Null-safety
val a: String? = null
Null-safety
val a: String? = null
println(a.length())
Null-safety
val a: String? = null
println(a.length())
Unsafe call
Ad

More Related Content

What's hot (20)

Introduction to Kotlin Language and its application to Android platform
Introduction to Kotlin Language and its application to Android platformIntroduction to Kotlin Language and its application to Android platform
Introduction to Kotlin Language and its application to Android platform
EastBanc Tachnologies
 
Getting Started With Kotlin
Getting Started With KotlinGetting Started With Kotlin
Getting Started With Kotlin
Gaurav sharma
 
A quick and fast intro to Kotlin
A quick and fast intro to Kotlin A quick and fast intro to Kotlin
A quick and fast intro to Kotlin
XPeppers
 
Scala in Practice
Scala in PracticeScala in Practice
Scala in Practice
Francesco Usai
 
Say Goodbye To Java: Getting Started With Kotlin For Android Development
Say Goodbye To Java: Getting Started With Kotlin For Android DevelopmentSay Goodbye To Java: Getting Started With Kotlin For Android Development
Say Goodbye To Java: Getting Started With Kotlin For Android Development
Adam Magaña
 
Coding for Android on steroids with Kotlin
Coding for Android on steroids with KotlinCoding for Android on steroids with Kotlin
Coding for Android on steroids with Kotlin
Kai Koenig
 
Static or Dynamic Typing? Why not both?
Static or Dynamic Typing? Why not both?Static or Dynamic Typing? Why not both?
Static or Dynamic Typing? Why not both?
Mario Camou Riveroll
 
Beauty & the Beast - Java VS TypeScript
Beauty & the Beast - Java VS TypeScriptBeauty & the Beast - Java VS TypeScript
Beauty & the Beast - Java VS TypeScript
Hendrik Ebbers
 
2017: Kotlin - now more than ever
2017: Kotlin - now more than ever2017: Kotlin - now more than ever
2017: Kotlin - now more than ever
Kai Koenig
 
Fall in love with Kotlin
Fall in love with KotlinFall in love with Kotlin
Fall in love with Kotlin
Hari Vignesh Jayapalan
 
Kotlin for Android Development
Kotlin for Android DevelopmentKotlin for Android Development
Kotlin for Android Development
Speck&Tech
 
Scala Introduction
Scala IntroductionScala Introduction
Scala Introduction
Adrian Spender
 
Groovy Programming Language
Groovy Programming LanguageGroovy Programming Language
Groovy Programming Language
Aniruddha Chakrabarti
 
Clojure in real life 17.10.2014
Clojure in real life 17.10.2014Clojure in real life 17.10.2014
Clojure in real life 17.10.2014
Metosin Oy
 
Ceylon - the language and its tools
Ceylon - the language and its toolsCeylon - the language and its tools
Ceylon - the language and its tools
Max Andersen
 
[Start] Scala
[Start] Scala[Start] Scala
[Start] Scala
佑介 九岡
 
Serializing EMF models with Xtext
Serializing EMF models with XtextSerializing EMF models with Xtext
Serializing EMF models with Xtext
meysholdt
 
Kotlin Language Features - A Java comparison
Kotlin Language Features - A Java comparisonKotlin Language Features - A Java comparison
Kotlin Language Features - A Java comparison
Ed Austin
 
Extending the Xbase Typesystem
Extending the Xbase TypesystemExtending the Xbase Typesystem
Extending the Xbase Typesystem
Sebastian Zarnekow
 
Ruby and rails - Advanced Training (Cybage)
Ruby and rails - Advanced Training (Cybage)Ruby and rails - Advanced Training (Cybage)
Ruby and rails - Advanced Training (Cybage)
Gautam Rege
 
Introduction to Kotlin Language and its application to Android platform
Introduction to Kotlin Language and its application to Android platformIntroduction to Kotlin Language and its application to Android platform
Introduction to Kotlin Language and its application to Android platform
EastBanc Tachnologies
 
Getting Started With Kotlin
Getting Started With KotlinGetting Started With Kotlin
Getting Started With Kotlin
Gaurav sharma
 
A quick and fast intro to Kotlin
A quick and fast intro to Kotlin A quick and fast intro to Kotlin
A quick and fast intro to Kotlin
XPeppers
 
Say Goodbye To Java: Getting Started With Kotlin For Android Development
Say Goodbye To Java: Getting Started With Kotlin For Android DevelopmentSay Goodbye To Java: Getting Started With Kotlin For Android Development
Say Goodbye To Java: Getting Started With Kotlin For Android Development
Adam Magaña
 
Coding for Android on steroids with Kotlin
Coding for Android on steroids with KotlinCoding for Android on steroids with Kotlin
Coding for Android on steroids with Kotlin
Kai Koenig
 
Static or Dynamic Typing? Why not both?
Static or Dynamic Typing? Why not both?Static or Dynamic Typing? Why not both?
Static or Dynamic Typing? Why not both?
Mario Camou Riveroll
 
Beauty & the Beast - Java VS TypeScript
Beauty & the Beast - Java VS TypeScriptBeauty & the Beast - Java VS TypeScript
Beauty & the Beast - Java VS TypeScript
Hendrik Ebbers
 
2017: Kotlin - now more than ever
2017: Kotlin - now more than ever2017: Kotlin - now more than ever
2017: Kotlin - now more than ever
Kai Koenig
 
Kotlin for Android Development
Kotlin for Android DevelopmentKotlin for Android Development
Kotlin for Android Development
Speck&Tech
 
Clojure in real life 17.10.2014
Clojure in real life 17.10.2014Clojure in real life 17.10.2014
Clojure in real life 17.10.2014
Metosin Oy
 
Ceylon - the language and its tools
Ceylon - the language and its toolsCeylon - the language and its tools
Ceylon - the language and its tools
Max Andersen
 
Serializing EMF models with Xtext
Serializing EMF models with XtextSerializing EMF models with Xtext
Serializing EMF models with Xtext
meysholdt
 
Kotlin Language Features - A Java comparison
Kotlin Language Features - A Java comparisonKotlin Language Features - A Java comparison
Kotlin Language Features - A Java comparison
Ed Austin
 
Extending the Xbase Typesystem
Extending the Xbase TypesystemExtending the Xbase Typesystem
Extending the Xbase Typesystem
Sebastian Zarnekow
 
Ruby and rails - Advanced Training (Cybage)
Ruby and rails - Advanced Training (Cybage)Ruby and rails - Advanced Training (Cybage)
Ruby and rails - Advanced Training (Cybage)
Gautam Rege
 

Similar to Kotlin for Android Developers - 1 (20)

Programming with Kotlin
Programming with KotlinProgramming with Kotlin
Programming with Kotlin
David Gassner
 
JVM languages "flame wars"
JVM languages "flame wars"JVM languages "flame wars"
JVM languages "flame wars"
Gal Marder
 
Kotlin from-scratch
Kotlin from-scratchKotlin from-scratch
Kotlin from-scratch
Franco Lombardo
 
Android 101 - Kotlin ( Future of Android Development)
Android 101 - Kotlin ( Future of Android Development)Android 101 - Kotlin ( Future of Android Development)
Android 101 - Kotlin ( Future of Android Development)
Hassan Abid
 
Kotlin for android 2019
Kotlin for android 2019Kotlin for android 2019
Kotlin for android 2019
Shady Selim
 
Scala and jvm_languages_praveen_technologist
Scala and jvm_languages_praveen_technologistScala and jvm_languages_praveen_technologist
Scala and jvm_languages_praveen_technologist
pmanvi
 
Rapid Web API development with Kotlin and Ktor
Rapid Web API development with Kotlin and KtorRapid Web API development with Kotlin and Ktor
Rapid Web API development with Kotlin and Ktor
Trayan Iliev
 
Dear Kotliners - Java Developers are Humans too
Dear Kotliners - Java Developers are Humans tooDear Kotliners - Java Developers are Humans too
Dear Kotliners - Java Developers are Humans too
Vivek Chanddru
 
Kotlin: Why Do You Care?
Kotlin: Why Do You Care?Kotlin: Why Do You Care?
Kotlin: Why Do You Care?
intelliyole
 
Introducing BoxLang : A new JVM language for productivity and modularity!
Introducing BoxLang : A new JVM language for productivity and modularity!Introducing BoxLang : A new JVM language for productivity and modularity!
Introducing BoxLang : A new JVM language for productivity and modularity!
Ortus Solutions, Corp
 
Swift and Kotlin Presentation
Swift and Kotlin PresentationSwift and Kotlin Presentation
Swift and Kotlin Presentation
Andrzej Sitek
 
Introduction to Scala language
Introduction to Scala languageIntroduction to Scala language
Introduction to Scala language
Aaqib Pervaiz
 
"Xapi-lang For declarative code generation" By James Nelson
"Xapi-lang For declarative code generation" By James Nelson"Xapi-lang For declarative code generation" By James Nelson
"Xapi-lang For declarative code generation" By James Nelson
GWTcon
 
JavaOne 2016 - Kotlin: The Language of The Future For JVM?
JavaOne 2016 - Kotlin: The Language of The Future For JVM?JavaOne 2016 - Kotlin: The Language of The Future For JVM?
JavaOne 2016 - Kotlin: The Language of The Future For JVM?
Leonardo Zanivan
 
Kotlin – the future of android
Kotlin – the future of androidKotlin – the future of android
Kotlin – the future of android
DJ Rausch
 
ActiveJDBC - ActiveRecord implementation in Java
ActiveJDBC - ActiveRecord implementation in JavaActiveJDBC - ActiveRecord implementation in Java
ActiveJDBC - ActiveRecord implementation in Java
ipolevoy
 
Java Programming Fundamentals: Complete Guide for Beginners
Java Programming Fundamentals: Complete Guide for BeginnersJava Programming Fundamentals: Complete Guide for Beginners
Java Programming Fundamentals: Complete Guide for Beginners
Taranath Jaishy
 
Real-world polyglot programming on the JVM - Ben Summers (ONEIS)
Real-world polyglot programming on the JVM  - Ben Summers (ONEIS)Real-world polyglot programming on the JVM  - Ben Summers (ONEIS)
Real-world polyglot programming on the JVM - Ben Summers (ONEIS)
jaxLondonConference
 
Polyglot
PolyglotPolyglot
Polyglot
Rory Preddy
 
The State of Managed Runtimes 2013, by Attila Szegedi
The State of Managed Runtimes 2013, by Attila SzegediThe State of Managed Runtimes 2013, by Attila Szegedi
The State of Managed Runtimes 2013, by Attila Szegedi
ZeroTurnaround
 
Programming with Kotlin
Programming with KotlinProgramming with Kotlin
Programming with Kotlin
David Gassner
 
JVM languages "flame wars"
JVM languages "flame wars"JVM languages "flame wars"
JVM languages "flame wars"
Gal Marder
 
Android 101 - Kotlin ( Future of Android Development)
Android 101 - Kotlin ( Future of Android Development)Android 101 - Kotlin ( Future of Android Development)
Android 101 - Kotlin ( Future of Android Development)
Hassan Abid
 
Kotlin for android 2019
Kotlin for android 2019Kotlin for android 2019
Kotlin for android 2019
Shady Selim
 
Scala and jvm_languages_praveen_technologist
Scala and jvm_languages_praveen_technologistScala and jvm_languages_praveen_technologist
Scala and jvm_languages_praveen_technologist
pmanvi
 
Rapid Web API development with Kotlin and Ktor
Rapid Web API development with Kotlin and KtorRapid Web API development with Kotlin and Ktor
Rapid Web API development with Kotlin and Ktor
Trayan Iliev
 
Dear Kotliners - Java Developers are Humans too
Dear Kotliners - Java Developers are Humans tooDear Kotliners - Java Developers are Humans too
Dear Kotliners - Java Developers are Humans too
Vivek Chanddru
 
Kotlin: Why Do You Care?
Kotlin: Why Do You Care?Kotlin: Why Do You Care?
Kotlin: Why Do You Care?
intelliyole
 
Introducing BoxLang : A new JVM language for productivity and modularity!
Introducing BoxLang : A new JVM language for productivity and modularity!Introducing BoxLang : A new JVM language for productivity and modularity!
Introducing BoxLang : A new JVM language for productivity and modularity!
Ortus Solutions, Corp
 
Swift and Kotlin Presentation
Swift and Kotlin PresentationSwift and Kotlin Presentation
Swift and Kotlin Presentation
Andrzej Sitek
 
Introduction to Scala language
Introduction to Scala languageIntroduction to Scala language
Introduction to Scala language
Aaqib Pervaiz
 
"Xapi-lang For declarative code generation" By James Nelson
"Xapi-lang For declarative code generation" By James Nelson"Xapi-lang For declarative code generation" By James Nelson
"Xapi-lang For declarative code generation" By James Nelson
GWTcon
 
JavaOne 2016 - Kotlin: The Language of The Future For JVM?
JavaOne 2016 - Kotlin: The Language of The Future For JVM?JavaOne 2016 - Kotlin: The Language of The Future For JVM?
JavaOne 2016 - Kotlin: The Language of The Future For JVM?
Leonardo Zanivan
 
Kotlin – the future of android
Kotlin – the future of androidKotlin – the future of android
Kotlin – the future of android
DJ Rausch
 
ActiveJDBC - ActiveRecord implementation in Java
ActiveJDBC - ActiveRecord implementation in JavaActiveJDBC - ActiveRecord implementation in Java
ActiveJDBC - ActiveRecord implementation in Java
ipolevoy
 
Java Programming Fundamentals: Complete Guide for Beginners
Java Programming Fundamentals: Complete Guide for BeginnersJava Programming Fundamentals: Complete Guide for Beginners
Java Programming Fundamentals: Complete Guide for Beginners
Taranath Jaishy
 
Real-world polyglot programming on the JVM - Ben Summers (ONEIS)
Real-world polyglot programming on the JVM  - Ben Summers (ONEIS)Real-world polyglot programming on the JVM  - Ben Summers (ONEIS)
Real-world polyglot programming on the JVM - Ben Summers (ONEIS)
jaxLondonConference
 
The State of Managed Runtimes 2013, by Attila Szegedi
The State of Managed Runtimes 2013, by Attila SzegediThe State of Managed Runtimes 2013, by Attila Szegedi
The State of Managed Runtimes 2013, by Attila Szegedi
ZeroTurnaround
 
Ad

Recently uploaded (20)

Buy vs. Build: Unlocking the right path for your training tech
Buy vs. Build: Unlocking the right path for your training techBuy vs. Build: Unlocking the right path for your training tech
Buy vs. Build: Unlocking the right path for your training tech
Rustici Software
 
AEM User Group DACH - 2025 Inaugural Meeting
AEM User Group DACH - 2025 Inaugural MeetingAEM User Group DACH - 2025 Inaugural Meeting
AEM User Group DACH - 2025 Inaugural Meeting
jennaf3
 
Wilcom Embroidery Studio Crack Free Latest 2025
Wilcom Embroidery Studio Crack Free Latest 2025Wilcom Embroidery Studio Crack Free Latest 2025
Wilcom Embroidery Studio Crack Free Latest 2025
Web Designer
 
Do not let staffing shortages and limited fiscal view hamper your cause
Do not let staffing shortages and limited fiscal view hamper your causeDo not let staffing shortages and limited fiscal view hamper your cause
Do not let staffing shortages and limited fiscal view hamper your cause
Fexle Services Pvt. Ltd.
 
Autodesk Inventor Crack (2025) Latest
Autodesk Inventor    Crack (2025) LatestAutodesk Inventor    Crack (2025) Latest
Autodesk Inventor Crack (2025) Latest
Google
 
Passive House Canada Conference 2025 Presentation [Final]_v4.ppt
Passive House Canada Conference 2025 Presentation [Final]_v4.pptPassive House Canada Conference 2025 Presentation [Final]_v4.ppt
Passive House Canada Conference 2025 Presentation [Final]_v4.ppt
IES VE
 
sequencediagrams.pptx software Engineering
sequencediagrams.pptx software Engineeringsequencediagrams.pptx software Engineering
sequencediagrams.pptx software Engineering
aashrithakondapalli8
 
Download 4k Video Downloader Crack Pre-Activated
Download 4k Video Downloader Crack Pre-ActivatedDownload 4k Video Downloader Crack Pre-Activated
Download 4k Video Downloader Crack Pre-Activated
Web Designer
 
Medical Device Cybersecurity Threat & Risk Scoring
Medical Device Cybersecurity Threat & Risk ScoringMedical Device Cybersecurity Threat & Risk Scoring
Medical Device Cybersecurity Threat & Risk Scoring
ICS
 
The-Future-is-Hybrid-Exploring-Azure’s-Role-in-Multi-Cloud-Strategies.pptx
The-Future-is-Hybrid-Exploring-Azure’s-Role-in-Multi-Cloud-Strategies.pptxThe-Future-is-Hybrid-Exploring-Azure’s-Role-in-Multi-Cloud-Strategies.pptx
The-Future-is-Hybrid-Exploring-Azure’s-Role-in-Multi-Cloud-Strategies.pptx
james brownuae
 
[gbgcpp] Let's get comfortable with concepts
[gbgcpp] Let's get comfortable with concepts[gbgcpp] Let's get comfortable with concepts
[gbgcpp] Let's get comfortable with concepts
Dimitrios Platis
 
wAIred_LearnWithOutAI_JCON_14052025.pptx
wAIred_LearnWithOutAI_JCON_14052025.pptxwAIred_LearnWithOutAI_JCON_14052025.pptx
wAIred_LearnWithOutAI_JCON_14052025.pptx
SimonedeGijt
 
Top 12 Most Useful AngularJS Development Tools to Use in 2025
Top 12 Most Useful AngularJS Development Tools to Use in 2025Top 12 Most Useful AngularJS Development Tools to Use in 2025
Top 12 Most Useful AngularJS Development Tools to Use in 2025
GrapesTech Solutions
 
How to Install and Activate ListGrabber Plugin
How to Install and Activate ListGrabber PluginHow to Install and Activate ListGrabber Plugin
How to Install and Activate ListGrabber Plugin
eGrabber
 
Adobe InDesign Crack FREE Download 2025 link
Adobe InDesign Crack FREE Download 2025 linkAdobe InDesign Crack FREE Download 2025 link
Adobe InDesign Crack FREE Download 2025 link
mahmadzubair09
 
Mastering Selenium WebDriver: A Comprehensive Tutorial with Real-World Examples
Mastering Selenium WebDriver: A Comprehensive Tutorial with Real-World ExamplesMastering Selenium WebDriver: A Comprehensive Tutorial with Real-World Examples
Mastering Selenium WebDriver: A Comprehensive Tutorial with Real-World Examples
jamescantor38
 
Robotic Process Automation (RPA) Software Development Services.pptx
Robotic Process Automation (RPA) Software Development Services.pptxRobotic Process Automation (RPA) Software Development Services.pptx
Robotic Process Automation (RPA) Software Development Services.pptx
julia smits
 
Wilcom Embroidery Studio Crack 2025 For Windows
Wilcom Embroidery Studio Crack 2025 For WindowsWilcom Embroidery Studio Crack 2025 For Windows
Wilcom Embroidery Studio Crack 2025 For Windows
Google
 
Memory Management and Leaks in Postgres from pgext.day 2025
Memory Management and Leaks in Postgres from pgext.day 2025Memory Management and Leaks in Postgres from pgext.day 2025
Memory Management and Leaks in Postgres from pgext.day 2025
Phil Eaton
 
Solar-wind hybrid engery a system sustainable power
Solar-wind  hybrid engery a system sustainable powerSolar-wind  hybrid engery a system sustainable power
Solar-wind hybrid engery a system sustainable power
bhoomigowda12345
 
Buy vs. Build: Unlocking the right path for your training tech
Buy vs. Build: Unlocking the right path for your training techBuy vs. Build: Unlocking the right path for your training tech
Buy vs. Build: Unlocking the right path for your training tech
Rustici Software
 
AEM User Group DACH - 2025 Inaugural Meeting
AEM User Group DACH - 2025 Inaugural MeetingAEM User Group DACH - 2025 Inaugural Meeting
AEM User Group DACH - 2025 Inaugural Meeting
jennaf3
 
Wilcom Embroidery Studio Crack Free Latest 2025
Wilcom Embroidery Studio Crack Free Latest 2025Wilcom Embroidery Studio Crack Free Latest 2025
Wilcom Embroidery Studio Crack Free Latest 2025
Web Designer
 
Do not let staffing shortages and limited fiscal view hamper your cause
Do not let staffing shortages and limited fiscal view hamper your causeDo not let staffing shortages and limited fiscal view hamper your cause
Do not let staffing shortages and limited fiscal view hamper your cause
Fexle Services Pvt. Ltd.
 
Autodesk Inventor Crack (2025) Latest
Autodesk Inventor    Crack (2025) LatestAutodesk Inventor    Crack (2025) Latest
Autodesk Inventor Crack (2025) Latest
Google
 
Passive House Canada Conference 2025 Presentation [Final]_v4.ppt
Passive House Canada Conference 2025 Presentation [Final]_v4.pptPassive House Canada Conference 2025 Presentation [Final]_v4.ppt
Passive House Canada Conference 2025 Presentation [Final]_v4.ppt
IES VE
 
sequencediagrams.pptx software Engineering
sequencediagrams.pptx software Engineeringsequencediagrams.pptx software Engineering
sequencediagrams.pptx software Engineering
aashrithakondapalli8
 
Download 4k Video Downloader Crack Pre-Activated
Download 4k Video Downloader Crack Pre-ActivatedDownload 4k Video Downloader Crack Pre-Activated
Download 4k Video Downloader Crack Pre-Activated
Web Designer
 
Medical Device Cybersecurity Threat & Risk Scoring
Medical Device Cybersecurity Threat & Risk ScoringMedical Device Cybersecurity Threat & Risk Scoring
Medical Device Cybersecurity Threat & Risk Scoring
ICS
 
The-Future-is-Hybrid-Exploring-Azure’s-Role-in-Multi-Cloud-Strategies.pptx
The-Future-is-Hybrid-Exploring-Azure’s-Role-in-Multi-Cloud-Strategies.pptxThe-Future-is-Hybrid-Exploring-Azure’s-Role-in-Multi-Cloud-Strategies.pptx
The-Future-is-Hybrid-Exploring-Azure’s-Role-in-Multi-Cloud-Strategies.pptx
james brownuae
 
[gbgcpp] Let's get comfortable with concepts
[gbgcpp] Let's get comfortable with concepts[gbgcpp] Let's get comfortable with concepts
[gbgcpp] Let's get comfortable with concepts
Dimitrios Platis
 
wAIred_LearnWithOutAI_JCON_14052025.pptx
wAIred_LearnWithOutAI_JCON_14052025.pptxwAIred_LearnWithOutAI_JCON_14052025.pptx
wAIred_LearnWithOutAI_JCON_14052025.pptx
SimonedeGijt
 
Top 12 Most Useful AngularJS Development Tools to Use in 2025
Top 12 Most Useful AngularJS Development Tools to Use in 2025Top 12 Most Useful AngularJS Development Tools to Use in 2025
Top 12 Most Useful AngularJS Development Tools to Use in 2025
GrapesTech Solutions
 
How to Install and Activate ListGrabber Plugin
How to Install and Activate ListGrabber PluginHow to Install and Activate ListGrabber Plugin
How to Install and Activate ListGrabber Plugin
eGrabber
 
Adobe InDesign Crack FREE Download 2025 link
Adobe InDesign Crack FREE Download 2025 linkAdobe InDesign Crack FREE Download 2025 link
Adobe InDesign Crack FREE Download 2025 link
mahmadzubair09
 
Mastering Selenium WebDriver: A Comprehensive Tutorial with Real-World Examples
Mastering Selenium WebDriver: A Comprehensive Tutorial with Real-World ExamplesMastering Selenium WebDriver: A Comprehensive Tutorial with Real-World Examples
Mastering Selenium WebDriver: A Comprehensive Tutorial with Real-World Examples
jamescantor38
 
Robotic Process Automation (RPA) Software Development Services.pptx
Robotic Process Automation (RPA) Software Development Services.pptxRobotic Process Automation (RPA) Software Development Services.pptx
Robotic Process Automation (RPA) Software Development Services.pptx
julia smits
 
Wilcom Embroidery Studio Crack 2025 For Windows
Wilcom Embroidery Studio Crack 2025 For WindowsWilcom Embroidery Studio Crack 2025 For Windows
Wilcom Embroidery Studio Crack 2025 For Windows
Google
 
Memory Management and Leaks in Postgres from pgext.day 2025
Memory Management and Leaks in Postgres from pgext.day 2025Memory Management and Leaks in Postgres from pgext.day 2025
Memory Management and Leaks in Postgres from pgext.day 2025
Phil Eaton
 
Solar-wind hybrid engery a system sustainable power
Solar-wind  hybrid engery a system sustainable powerSolar-wind  hybrid engery a system sustainable power
Solar-wind hybrid engery a system sustainable power
bhoomigowda12345
 
Ad

Kotlin for Android Developers - 1

  • 2. Contents • Intro • Hello, Kotlin! • What Kotlin Adds to Java • Kotlin Android Extensions • Android Kotlin extensions “KTX”
  • 3. Background • Apple got a nice(r) new language • Android stuck with Java • Not fair!
  • 4. Java is not just about Java "Most people talk about Java the language, and this may sound odd `coming from me, but I could hardly care less. At the core of the Java ecosystem is the JVM." James Gosling, Creator of the Java Programming Language(2011, TheServerSide.com)
  • 5. What's Right with Java? • The JVM runs on virtually every platform - from your credit card to the largest mainframe • Cross platform compatibility has been a hallmark of Java from the very beginning • Huge investment in a highly stable and performant runtime • Many important and large systems are written in Java • The open source movement flourished with Java • Many important architectural concepts in use today have come from the Java/Open Source space
  • 6. What's Wrong with Java? • Many Java code bases are unmitigated disasters • Many Java developers are undisciplined hacks • Enterprise systems - EJBs, WebSphere, etc. • The Java language suffered from years of inattention • Java 8 is great, but very late and many clients have not upgraded • Missing modern features Lambdas, properties, higher-order functions • Null safety NullPointerException Java is a good language...there are some issues...you can make things as God awful as you want... it does allow people to create incredible messes (Gosling)
  • 7. Java on Android - the bad parts • Java 7 was out 2011. - partial support 2013. • Java 8 was out 2014. - support will announced in the near future • Null references • Covariant arrays • Raw types • No Lambda expressions • Checked exceptions
  • 8. Other JVM Languages • Groovy (Dynamic) - Pivotal donated to Apache where projects go to die • Clojure (Lisp on JVM) • Scala (static types, functional, ML on the JVM) • Kotlin • Dozens more
  • 9. Kotlin Milestones • Project Kotlin unveiled in July 2011 • Kotlin 1.0 released in February 2016 • “Language of the Month” - Dr. Dobb’s Journal (01/2012)
  • 10. Motivation • Huge Java codebase (>50k classes, 10 years old) • Building tools for many nice languages • Want a modern, expressive language …that’s easy to introduce in the existing environment • Need efficient tooling • None of the existing languages was a good fit
  • 11. Why Kotlin? • Kotlin is not an academic language - it is practical • Kotlin does not make you change the way you think (unlike Scala and Clojure) • Seamless Java interop (the killer feature) • Makes Android development less painful (Android is the killer app for Kotlin) • JDK 6!
  • 12. Building Kotlin • Same structure as Java - packages, classes, etc. • Builds with Maven/Gradle/Ant • Java and Kotlin can live side by side in the same project
  • 13. Kotlin Language Features • Semicolons are optional and discouraged • Multiple classes in files • Very relaxed about classes, file names, etc. • Codifies many conventions leading to more concise code • Type inference • Lambdas before Java 8 • Null Safety • Domain-Specific Languages “DSL” Construction
  • 14. Advantages of Kotlin • Modern statically typed, object oriented language that borrows manyideas from functional languages • Fast learning curve - inspired by Scala and C# • Meant to be used for building large software systems • Engineered to be highly interoperable with Java - you can use existing code base w/o (many) problems
  • 15. Advantages of Kotlin cont. • The team behind it is JetBrains, creators of IntelliJ which is Android Studio based on. Also has some contributions from James Strachan - creator of Groovy • Significantly more concise and readable than Java, which means it’s easier to maintain • Lightweight - Kotlin stdlib has 8k methods • If it means something to someone - it also compiles to Javascript
  • 16. Dalvik ART Android Java source javac Kotlin source kotlinc bytecode JVM Backend JVM Desktop
  • 17. You Can Have Java & Kotlin Code In One Project Kotlin code Java code
  • 18. Just another library for your app rxjava-2.1.2 kotlin-stdlib-1.1.4 6315 10212
  • 19. No Kotlin SDK …just JDK + extensions small runtime jar easy Java interop
  • 20. Gradle & Kotlin Writing Gradle build scripts and plugins in Kotlin
  • 22. Java Kotlin public class PersonInJava { private int id; private String name; public PersonInJava(int id, String name) { this.id = id; this.name = name; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; PersonInJava that = (PersonInJava) o; if (id != that.id) return false; return name.equals(that.name); } @Override public int hashCode() { int result = id; result = 31 * result + name.hashCode(); return result; } } data class PersonInKotlin (var id: Int, var name:String) Less code means less Bugs
  • 24. fun main(args: Array<String>): Unit { println("Hello, World!") } > Hello, World!
  • 25. fun main(args: Array<String>): Unit { println("Hello, World!") } Function keyword
  • 26. fun main(args: Array<String>): Unit { println("Hello, World!") } Function name
  • 27. fun main(args: Array<String>): Unit { println("Hello, World!") } Argumentname
  • 28. fun main(args: Array<String>): Unit { println("Hello, World!") } Argumenttype
  • 29. fun main(args: Array<String>): Unit { println("Hello, World!") } Return type
  • 30. fun main(args: Array<String>): Unit { println("Hello, World!") }
  • 31. fun main(args: Array<String>): Unit { println("Hello, World!") } Unit inferred
  • 32. fun main(args: Array<String>) { println("Hello, World!") }
  • 33. fun main(args: Array<String>) { println("Hello, World!") }
  • 34. fun main(args: Array<String>) { var name = "World" println("Hello, $name!") }
  • 35. fun main(args: Array<String>) { var name = "World" println("Hello, $name!") } Variable declaration
  • 36. fun main(args: Array<String>) { var name = "World“ println("Hello, $name!") } String interpolation
  • 37. fun main(args: Array<String>) { var name = "World" if (args.isNotEmpty()) { name = args[0] } println("Hello, $name!") }
  • 38. fun main(args: Array<String>) { var name = "World" if (args.isNotEmpty()) { name = args[0] } println("Hello, $name!") }
  • 39. fun main(args: Array<String>) { val name = "World" if (args.isNotEmpty()) { name = args[0] } println("Hello, $name!") }
  • 40. fun main(args: Array<String>) { val name = "World" if (args.isNotEmpty()) { name = args[0] } println("Hello, $name!") } Constant declaration
  • 41. fun main(args: Array<String>) { val name = "World" if (args.isNotEmpty()) { name = args[0] } println("Hello, $name!") } Val cannot be reassigned
  • 42. fun main(args: Array<String>) { val name = "World" if (args.isNotEmpty()) { name = args[0] } println("Hello, $name!") }
  • 43. fun main(args: Array<String>) { val name = if (args.isNotEmpty()) { args[0] } else { "World" } println("Hello, $name!") }
  • 44. fun main(args: Array<String>) { val name = if (args.isNotEmpty()) { args[0] } else { "World" } println("Hello, $name!") }
  • 45. fun main(args: Array<String>) { val name = if (args.isNotEmpty()) { args[0] } else { "World" } println("Hello, $name!") } Conditional assignment block
  • 46. fun main(args: Array<String>) { val name = if (args.isNotEmpty()) { args[0] } else { "World" } println("Hello, $name!") }
  • 47. fun main(args: Array<String>) { val name = if (args.isNotEmpty()) args[0] else "World" println("Hello, $name!") }
  • 48. class Person(var name: String) fun main(args: Array<String>) { val name = if (args.isNotEmpty()) args[0] else "World" println("Hello, $name!") }
  • 49. class Person(var name: String) fun main(args: Array<String>) { val name = if (args.isNotEmpty()) args[0] else "World" println("Hello, $name!") } Class keyword
  • 50. class Person(var name: String) fun main(args: Array<String>) { val name = if (args.isNotEmpty()) args[0] else "World" println("Hello, $name!") } Class name
  • 51. class Person(var name: String) fun main(args: Array<String>) { val name = if (args.isNotEmpty()) args[0] else "World" println("Hello, $name!") } Primaryconstructor
  • 52. class Person(var name: String) fun main(args: Array<String>) { val name = if (args.isNotEmpty()) args[0] else "World" println("Hello, $name!") } Non-final classmember
  • 53. class Person(var name: String) fun main(args: Array<String>) { val name = if (args.isNotEmpty()) args[0] else "World" println("Hello, $name!") }
  • 54. class Person(var name: String) fun main(args: Array<String>) { println("Hello, $name!") }
  • 55. class Person(var name: String) fun main(args: Array<String>) { val person = Person("Michael") println("Hello, $name!") }
  • 56. class Person(var name: String) fun main(args: Array<String>) { val person = Person("Michael") println("Hello, $name!") } Instance declaration
  • 57. class Person(var name: String) fun main(args: Array<String>) { val person = Person("Michael") println("Hello, $name!") }
  • 58. class Person(var name: String) fun main(args: Array<String>) { val person = Person("Michael") println("Hello, ${person.name}!") } > Hello, Michael!
  • 59. enum class Language(val greeting: String) { EN("Hello"), ES("Hola"), FR("Bonjour") } class Person(var name: String) fun main(args: Array<String>) { val person = Person("Michael") println("Hello, ${person.name}!") }
  • 60. enum class Language(val greeting: String) { EN("Hello"), ES("Hola"), FR("Bonjour") } class Person(var name: String) fun main(args: Array<String>) { val person = Person("Michael") println("Hello, ${person.name}!") }
  • 61. enum class Language(val greeting: String) { EN("Hello"), ES("Hola"), FR("Bonjour") } class Person(var name: String, var lang: Language) fun main(args: Array<String>) { val person = Person("Michael") println("Hello, ${person.name}!") }
  • 62. enum class Language(val greeting: String) { EN("Hello"), ES("Hola"), FR("Bonjour") } class Person(var name: String, var lang: Language = Language.EN) fun main(args: Array<String>) { val person = Person("Michael") println("Hello, ${person.name}!") } Defaultvalue
  • 63. enum class Language(val greeting: String) { EN("Hello"), ES("Hola"), FR("Bonjour") } class Person(var name: String, var lang: Language = Language.EN) fun main(args: Array<String>) { val person = Person("Michael") println("Hello, ${person.name}!") }
  • 64. enum class Language(val greeting: String) { EN("Hello"), ES("Hola"), FR("Bonjour") } class Person(var name: String, var lang: Language = Language.EN) { fun greet() = println("${lang.greeting}, $name!") } fun main(args: Array<String>) { val person = Person("Michael") println("Hello, ${person.name}!") }
  • 65. enum class Language(val greeting: String) { EN("Hello"), ES("Hola"), FR("Bonjour") } class Person(var name: String, var lang: Language = Language.EN) { fun greet() = println("${lang.greeting}, $name!") } fun main(args: Array<String>) { val person = Person("Michael") println("Hello, ${person.name}!") }
  • 66. enum class Language(val greeting: String) { EN("Hello"), ES("Hola"), FR("Bonjour") } class Person(var name: String, var lang: Language = Language.EN) { fun greet() = println("${lang.greeting}, $name!") } fun main(args: Array<String>) { val person = Person("Michael") }
  • 67. enum class Language(val greeting: String) { EN("Hello"), ES("Hola"), FR("Bonjour") } class Person(var name: String, var lang: Language = Language.EN) { fun greet() = println("${lang.greeting}, $name!") } fun main(args: Array<String>) { val person = Person("Michael") person.greet() } > Hello, Michael!
  • 68. enum class Language(val greeting: String) { EN("Hello"), ES("Hola"), FR("Bonjour") } class Person(var name: String, var lang: Language = Language.EN) { fun greet() = println("${lang.greeting}, $name!") } fun main(args: Array<String>) { }
  • 69. enum class Language(val greeting: String) { EN("Hello"), ES("Hola"), FR("Bonjour") } class Person(var name: String, var lang: Language = Language.EN) { fun greet() = println("${lang.greeting}, $name!") } fun main(args: Array<String>) { val people = listOf( Person("Michael"), Person("Miguel", Language.SP), Person("Michelle", Language.FR) ) }
  • 70. enum class Language(val greeting: String) { EN("Hello"), ES("Hola"), FR("Bonjour") } class Person(var name: String, var lang: Language = Language.EN) { fun greet() = println("${lang.greeting}, $name!") } fun main(args: Array<String>) { val people = listOf( Person("Michael"), Person("Miguel", Language.SP), Person("Michelle", Language.FR) ) for (person in people) { person.greet() } }
  • 71. enum class Language(val greeting: String) { EN("Hello"), ES("Hola"), FR("Bonjour") } class Person(var name: String, var lang: Language = Language.EN) { fun greet() = println("${lang.greeting}, $name!") } fun main(args: Array<String>) { val people = listOf( Person("Michael"), Person("Miguel", Language.SP), Person("Michelle", Language.FR) ) people.forEach { person -> person.greet() } }
  • 72. enum class Language(val greeting: String) { EN("Hello"), ES("Hola"), FR("Bonjour") } class Person(var name: String, var lang: Language = Language.EN) { fun greet() = println("${lang.greeting}, $name!") } fun main(args: Array<String>) { val people = listOf( Person("Michael"), Person("Miguel", Language.SP), Person("Michelle", Language.FR) ) people.forEach { it.greet() } }
  • 73. enum class Language(val greeting: String) { EN("Hello"), ES("Hola"), FR("Bonjour") } class Person(var name: String, var lang: Language = Language.EN) { fun greet() = println("${lang.greeting}, $name!") } fun main(args: Array<String>) { listOf( Person("Michael"), Person("Miguel", Language.SP), Person("Michelle", Language.FR) ).forEach { it.greet() } } > Hello, Michael! > Hola, Miguel! > Bonjour, Michelle!
  • 74. enum class Language(val greeting: String) { EN("Hello"), ES("Hola"), FR("Bonjour") } open class Person(var name: String, var lang: Language = Language.EN) { fun greet() = println("${lang.greeting}, $name!") } fun main(args: Array<String>) { listOf( Person("Michael"), Person("Miguel", Language.SP), Person("Michelle", Language.FR) ).forEach { it.greet() }. } Non-final
  • 75. enum class Language(val greeting: String) { EN("Hello"), ES("Hola"), FR("Bonjour") } open class Person(var name: String, var lang: Language = Language.EN) { fun greet() = println("${lang.greeting}, $name!") } class Hispanophone(name: String) : Person(name, Language.ES) class Francophone(name: String) : Person(name, Language.FR) fun main(args: Array<String>) { listOf( Person("Michael"), Person("Miguel", Language.SP), Person("Michelle", Language.FR) ).forEach { it.greet() } } Inheritance
  • 76. enum class Language(val greeting: String) { EN("Hello"), ES("Hola"), FR("Bonjour") } open class Person(var name: String, var lang: Language = Language.EN) { fun greet() = println("${lang.greeting}, $name!") } class Hispanophone(name: String) : Person(name, Language.ES) class Francophone(name: String) : Person(name, Language.FR) fun main(args: Array<String>) { listOf( Person("Michael"), Hispanophone("Miguel"), Francophone("Michelle") ).forEach { it.greet() } }
  • 77. enum class Language(val greeting: String) { EN("Hello"), ES("Hola"), FR("Bonjour") } open class Person(var name: String, var lang: Language = Language.EN) { fun greet() = println("${lang.greeting}, $name!") } class Hispanophone(name: String) : Person(name, Language.ES) class Francophone(name: String) : Person(name, Language.FR) fun main(args: Array<String>) { listOf( Person("Michael"), Hispanophone("Miguel"), Francophone("Michelle") ).forEach { it.greet() } }
  • 78. What Kotlin Adds to Java
  • 83. Type inference var string = "" Var char = ' '
  • 84. Type inference var string = "" var char = ' ' var int = 0
  • 85. Type inference var string = "" var char = ' ' var int = 0 var long = 0L
  • 86. Type inference var string = "" var char = ' ' var int = 0 var long = 0L var float = 0F
  • 87. Type inference var int = 0 var long = 0L var float = 0F var double = 0.0 var string = "" var char = ' '
  • 88. Type inference var string = "" var char = ' ' var int = 0 var long = 0L var float = 0F var double = 0.0 var boolean = true
  • 89. Type inference var string = "" var char = ' ' var int = 0 var long = 0L var float = 0F var double = 0.0 var boolean = true var foo = MyFooType()
  • 92. Null-safety String a = null; System.out.println(a.length());
  • 93. Null-safety String a = null; System.out.println(a.length()); NullPointerException
  • 95. Null-safety val a: String = null Non-null type
  • 98. Null-safety val a: String? = null println(a.length())
  • 99. Null-safety val a: String? = null println(a.length()) Unsafe call
  翻译: