SlideShare une entreprise Scribd logo
1  sur  29
Télécharger pour lire hors ligne
KOTLIN
MOJE DOŚWIADCZENIE
DAMIAN PETLA
ANDROID DEVELOPER
e-mail: damian.petla@schibsted.pl
LinkedIn: pl.linkedin.com/in/damianpetla
1. DLACZEGO WYBRAŁEM
KOTLINA?
CIEKAWOŚĆ
CODE REVIEW Z iOS
JETBRAINS - ZNANA MARKA
ROZMIAR APK I SZYBKA KOMPILACJA
2. CZY TRUDNO JEST
ZACZĄĆ?
50 GODZIN
SKŁADNIA
NOWE PODEJŚCIE
class User(val name: String, age: Int?)
val name: String = “Damian”
var isSuperUser: Boolean = true
var pet: String? = null
public fun sayHi(name: String, times: Int = 3) {
for (i in 1..times) {
println(“Hi $name”)
}
}
private fun getSome() : String {
return “some”
}
Kotlin
3. CO NAJBARDZIEJ MI SIĘ
PODOBA W KOTLINIE?
BEZPIECZNY KOD
InputStream stream = ...
if (stream != null) {
stream.close();
}
stream.close()
stream?.close()
Java
Kotlin
3. CO NAJBARDZIEJ MI SIĘ
PODOBA W KOTLINIE?
BEZPIECZNY KOD
PROSTE DEFINICJE KLAS
public class Item {
private String type;
public Item(String type) {
this.type = type;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Item item2 = (Item) o;
if (type != null ? !type.equals(item2.type) : item2.type != null) return false;
return true;
}
@Override
public int hashCode() {
return type != null ? type.hashCode() : 0;
}
@Override
public String toString() {
return "Item2{" +
"type='" + type + ''' +
'}';
}
}
public class Article extends Item {
private Boolean isDeleted;
private String id;
private String category;
private String published;
private String publishedFormatted;
private String firstPublished;
private String updated;
private String created;
private List<Topic> topics;
private String title;
private String newsLifetime;
private Integer newsValue;
private List<Author> authors;
private List<Resource> resources
private Version version;
private String vignette;
private String displaySize;
private Boolean live;
private Boolean breaking;
private Story story;
private Boolean sponsored = false;
public Article(String type) {
super(type);
}
public Article(String type, Boolean isDeleted, String id, String category, String published,
String publishedFormatted, String firstPublished, String updated, String created,
List<Topic> topics, String title, String newsLifetime, Integer newsValue,
List<Author> authors, List<Resource> resources, Version version, String vignette,
String displaySize, Boolean live, Boolean breaking, Story story, Boolean sponsored) {
super(type);
this.isDeleted = isDeleted;
this.id = id;
this.category = category;
this.published = published;
this.publishedFormatted = publishedFormatted;
this.firstPublished = firstPublished;
this.updated = updated;
this.created = created;
this.topics = topics;
this.title = title;
this.newsLifetime = newsLifetime;
this.newsValue = newsValue;
this.authors = authors;
this.resources = resources;
this.version = version;
this.vignette = vignette;
this.displaySize = displaySize;
this.live = live;
this.breaking = breaking;
this.story = story;
this.sponsored = sponsored;
}
public Boolean getIsDeleted() {
return isDeleted;
}
public void setIsDeleted(Boolean isDeleted) {
this.isDeleted = isDeleted;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getCategory() {
return category;
}
public void setCategory(String category) {
this.category = category;
}
public String getPublished() {
return published;
}
public void setPublished(String published) {
this.published = published;
}
public String getPublishedFormatted() {
return publishedFormatted;
}
public void setPublishedFormatted(String publishedFormatted) {
this.publishedFormatted = publishedFormatted;
}
public String getFirstPublished() {
return firstPublished;
}
public void setFirstPublished(String firstPublished) {
this.firstPublished = firstPublished;
}
public String getUpdated() {
return updated;
}
public void setUpdated(String updated) {
this.updated = updated;
}
public String getCreated() {
return created;
}
public void setCreated(String created) {
this.created = created;
}
public List<Topic> getTopics() {
return topics;
}
public void setTopics(List<Topic> topics) {
this.topics = topics;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getNewsLifetime() {
return newsLifetime;
}
public void setNewsLifetime(String newsLifetime) {
this.newsLifetime = newsLifetime;
}
public Integer getNewsValue() {
return newsValue;
}
public void setNewsValue(Integer newsValue) {
this.newsValue = newsValue;
}
public List<Author> getAuthors() {
return authors;
}
public void setAuthors(List<Author> authors) {
this.authors = authors;
}
public List<Resource> getResources() {
return resources;
}
public void setResources(List<Resource> resources) {
this.resources = resources;
}
public Version getVersion() {
return version;
}
public void setVersion(Version version) {
this.version = version;
}
public String getVignette() {
return vignette;
}
public void setVignette(String vignette) {
this.vignette = vignette;
}
public String getDisplaySize() {
return displaySize;
}
public void setDisplaySize(String displaySize) {
this.displaySize = displaySize;
}
public Boolean getLive() {
return live;
}
public void setLive(Boolean live) {
this.live = live;
}
public Boolean getBreaking() {
return breaking;
}
public void setBreaking(Boolean breaking) {
this.breaking = breaking;
}
public Story getStory() {
return story;
}
public void setStory(Story story) {
this.story = story;
}
public Boolean getSponsored() {
return sponsored;
}
public void setSponsored(Boolean sponsored) {
this.sponsored = sponsored;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
if (!super.equals(o)) return false;
Article article2 = (Article) o;
if (authors != null ? !authors.equals(article2.authors) : article2.authors != null) return false;
if (breaking != null ? !breaking.equals(article2.breaking) : article2.breaking != null) return false;
if (category != null ? !category.equals(article2.category) : article2.category != null) return false;
if (created != null ? !created.equals(article2.created) : article2.created != null) return false;
if (displaySize != null ? !displaySize.equals(article2.displaySize) : article2.displaySize != null)
return false;
if (firstPublished != null ? !firstPublished.equals(article2.firstPublished) : article2.firstPublished != null)
return false;
if (id != null ? !id.equals(article2.id) : article2.id != null) return false;
if (isDeleted != null ? !isDeleted.equals(article2.isDeleted) : article2.isDeleted != null) return false;
if (live != null ? !live.equals(article2.live) : article2.live != null) return false;
if (newsLifetime != null ? !newsLifetime.equals(article2.newsLifetime) : article2.newsLifetime != null)
return false;
if (newsValue != null ? !newsValue.equals(article2.newsValue) : article2.newsValue != null) return false;
if (published != null ? !published.equals(article2.published) : article2.published != null) return false;
if (publishedFormatted != null ? !publishedFormatted.equals(article2.publishedFormatted) :
article2.publishedFormatted != null) return false;
if (resources != null ? !resources.equals(article2.resources) : article2.resources != null) return false;
if (sponsored != null ? !sponsored.equals(article2.sponsored) : article2.sponsored != null) return false;
if (story != null ? !story.equals(article2.story) : article2.story != null) return false;
if (title != null ? !title.equals(article2.title) : article2.title != null) return false;
if (topics != null ? !topics.equals(article2.topics) : article2.topics != null) return false;
if (updated != null ? !updated.equals(article2.updated) : article2.updated != null) return false;
if (version != null ? !version.equals(article2.version) : article2.version != null) return false;
if (vignette != null ? !vignette.equals(article2.vignette) : article2.vignette != null) return false;
return true;
}
@Override
public int hashCode() {
int result = super.hashCode();
result = 31 * result + (isDeleted != null ? isDeleted.hashCode() : 0);
result = 31 * result + (id != null ? id.hashCode() : 0);
result = 31 * result + (category != null ? category.hashCode() : 0);
result = 31 * result + (published != null ? published.hashCode() : 0);
result = 31 * result + (publishedFormatted != null ? publishedFormatted.hashCode() : 0);
result = 31 * result + (firstPublished != null ? firstPublished.hashCode() : 0);
result = 31 * result + (updated != null ? updated.hashCode() : 0);
result = 31 * result + (created != null ? created.hashCode() : 0);
result = 31 * result + (topics != null ? topics.hashCode() : 0);
result = 31 * result + (title != null ? title.hashCode() : 0);
result = 31 * result + (newsLifetime != null ? newsLifetime.hashCode() : 0);
result = 31 * result + (newsValue != null ? newsValue.hashCode() : 0);
result = 31 * result + (authors != null ? authors.hashCode() : 0);
result = 31 * result + (resources != null ? resources.hashCode() : 0);
result = 31 * result + (version != null ? version.hashCode() : 0);
result = 31 * result + (vignette != null ? vignette.hashCode() : 0);
result = 31 * result + (displaySize != null ? displaySize.hashCode() : 0);
result = 31 * result + (live != null ? live.hashCode() : 0);
result = 31 * result + (breaking != null ? breaking.hashCode() : 0);
result = 31 * result + (story != null ? story.hashCode() : 0);
result = 31 * result + (sponsored != null ? sponsored.hashCode() : 0);
return result;
}
@Override
public String toString() {
return "Article{" +
open class Item(val type: ItemTypeEnum): Serializable
data class Article(type: ItemTypeEnum,
val isDeleted: Boolean?,
val id: String,
val category: String,
val published: String,
var publishedFormatted: String?,
val firstPublished: String?,
val updated: String,
val created: String,
val topics: Array<Topic>,
val title: String,
val newsLifetime: String,
val newsValue: Int,
val authors: Array<Author>,
val resources: Array<Resource>,
val version: Version?,
val vignette: String?,
val displaySize: String,
val live: Boolean?,
val breaking: Boolean?,
val story: Story?,
val sponsored: Boolean = false
) : Item(type)
Java - 354 Kotlin - 25
data class User(val name: String,
val surname: String,
val age: Int)
val user = User(“Damian”, “Petla”, 33)
val user2 = user.copy(age = 30, name = “Adam”)
println(user)
println(user2)
User(name=Damian, surname=Petla, age=33)
User(name=Adam, surname=Petla, age=30)
Kotlin
Log
3. CO NAJBARDZIEJ MI SIĘ
PODOBA W KOTLINIE?
BEZPIECZNY KOD
PROSTE DEFINICJE KLAS
LAMBDA
STRING TEMPLATES
Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
System.out.println(“Hello! " + v.isOpaque());
}
});
Java
Kotlin
val button = findViewById(R.id.button) as Button
button.setOnClickListener { println("Hello! ${it.isOpaque()}") }
3. CO NAJBARDZIEJ MI SIĘ
PODOBA W KOTLINIE?
BEZPIECZNY KOD
PROSTE DEFINICJE KLAS
LAMBDA
STRING TEMPLATES
SMART CAST
int l = 0;
if (obj instanceof String) {
l = ((String)obj).length;
}
Java
Kotlin
var l = 0
if (obj is String) {
l = obj.length
}
val l : Int = (obj as? String)?.length ?: 0
3. CO NAJBARDZIEJ MI SIĘ
PODOBA W KOTLINIE?
BEZPIECZNY KOD
PROSTE DEFINICJE KLAS
LAMBDA
STRING TEMPLATES
SMART CAST
FUNCTION EXTENSIONS
String utcDate = ...
String formatted = Utilites.toPrettyDate(utcDate);
textView.setText(formatted);
Java
Kotlin
textView.setText(utcDate.toPrettyDate())
fun String.toPrettyDate(): String {
return “$this is formatted now”
}
4. CZY SĄ JAKIEŚ
PROBLEMY Z KOTLINEM?
SZYBKA ODPOWIEDŹ NA ZGŁOSZONE BŁEDY
JETBRAINS AKTYWNY NA STACK OVERFLOW
220 BUGÓW NAPRAWIONYCH W WERSJI M11(0.11.91)
Experimental J-Unit support
Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP
Java
Kotlin
Build.VERSION.SDK_INT >= 21
5. OD CZEGO ZACZĄĆ
NAUKĘ?
HTTP://KOTLINLANG.ORG/DOCS/REFERENCE/
HTTP://KOTLINLANG.ORG/DOCS/TUTORIALS/KOTLIN-ANDROID.HTML
HTTPS://DOCS.GOOGLE.COM/DOCUMENT/D/1RES3EP-HJXWA8KZI0YQDBEHCQTT29HG8P44AA9W0DM8
6. KTO UŻYWA KOTLINA?
7. CZY MAM JAKIEŚ PORADY
NA POCZĄTEK?
!! ZAMIAST ?
CZĘSTO WRACAJ DO DOKUMENTACJI
UDZIELAJ SIĘ W COMMUNITY
Q & A
EXTRA
Android Kotlin Plugin

Contenu connexe

Tendances

Mining the social web ch1
Mining the social web ch1Mining the social web ch1
Mining the social web ch1HyeonSeok Choi
 
{tidytext}と{RMeCab}によるモダンな日本語テキスト分析
{tidytext}と{RMeCab}によるモダンな日本語テキスト分析{tidytext}と{RMeCab}によるモダンな日本語テキスト分析
{tidytext}と{RMeCab}によるモダンな日本語テキスト分析Takashi Kitano
 
MySQLConf2009: Taking ActiveRecord to the Next Level
MySQLConf2009: Taking ActiveRecord to the Next LevelMySQLConf2009: Taking ActiveRecord to the Next Level
MySQLConf2009: Taking ActiveRecord to the Next LevelBlythe Dunham
 
JDD2015: Functional programing and Event Sourcing - a pair made in heaven - e...
JDD2015: Functional programing and Event Sourcing - a pair made in heaven - e...JDD2015: Functional programing and Event Sourcing - a pair made in heaven - e...
JDD2015: Functional programing and Event Sourcing - a pair made in heaven - e...PROIDEA
 
令和から本気出す
令和から本気出す令和から本気出す
令和から本気出すTakashi Kitano
 
Python avanzado - parte 1
Python avanzado - parte 1Python avanzado - parte 1
Python avanzado - parte 1coto
 
{tidygraph}と{ggraph}による モダンなネットワーク分析(未公開ver)
{tidygraph}と{ggraph}による モダンなネットワーク分析(未公開ver){tidygraph}と{ggraph}による モダンなネットワーク分析(未公開ver)
{tidygraph}と{ggraph}による モダンなネットワーク分析(未公開ver)Takashi Kitano
 
The Art, Joy, and Power of Creating Musical Programs (JFugue at SXSW Interact...
The Art, Joy, and Power of Creating Musical Programs (JFugue at SXSW Interact...The Art, Joy, and Power of Creating Musical Programs (JFugue at SXSW Interact...
The Art, Joy, and Power of Creating Musical Programs (JFugue at SXSW Interact...David Koelle
 

Tendances (12)

Kotlin standard
Kotlin standardKotlin standard
Kotlin standard
 
Mining the social web ch1
Mining the social web ch1Mining the social web ch1
Mining the social web ch1
 
{tidytext}と{RMeCab}によるモダンな日本語テキスト分析
{tidytext}と{RMeCab}によるモダンな日本語テキスト分析{tidytext}と{RMeCab}によるモダンな日本語テキスト分析
{tidytext}と{RMeCab}によるモダンな日本語テキスト分析
 
MySQLConf2009: Taking ActiveRecord to the Next Level
MySQLConf2009: Taking ActiveRecord to the Next LevelMySQLConf2009: Taking ActiveRecord to the Next Level
MySQLConf2009: Taking ActiveRecord to the Next Level
 
JDD2015: Functional programing and Event Sourcing - a pair made in heaven - e...
JDD2015: Functional programing and Event Sourcing - a pair made in heaven - e...JDD2015: Functional programing and Event Sourcing - a pair made in heaven - e...
JDD2015: Functional programing and Event Sourcing - a pair made in heaven - e...
 
令和から本気出す
令和から本気出す令和から本気出す
令和から本気出す
 
Backbone intro
Backbone introBackbone intro
Backbone intro
 
Python avanzado - parte 1
Python avanzado - parte 1Python avanzado - parte 1
Python avanzado - parte 1
 
{tidygraph}と{ggraph}による モダンなネットワーク分析(未公開ver)
{tidygraph}と{ggraph}による モダンなネットワーク分析(未公開ver){tidygraph}と{ggraph}による モダンなネットワーク分析(未公開ver)
{tidygraph}と{ggraph}による モダンなネットワーク分析(未公開ver)
 
What's new in C# 6?
What's new in C# 6?What's new in C# 6?
What's new in C# 6?
 
The Art, Joy, and Power of Creating Musical Programs (JFugue at SXSW Interact...
The Art, Joy, and Power of Creating Musical Programs (JFugue at SXSW Interact...The Art, Joy, and Power of Creating Musical Programs (JFugue at SXSW Interact...
The Art, Joy, and Power of Creating Musical Programs (JFugue at SXSW Interact...
 
Benefits of Kotlin
Benefits of KotlinBenefits of Kotlin
Benefits of Kotlin
 

En vedette

No pressure, no diamonds. Rzecz o łamaniu zasad w projektach.
No pressure, no diamonds. Rzecz o łamaniu zasad w projektach.No pressure, no diamonds. Rzecz o łamaniu zasad w projektach.
No pressure, no diamonds. Rzecz o łamaniu zasad w projektach.3camp
 
Systemy automatycznej informacji sterowanej głosem – Kolejna rewolucja w IT p...
Systemy automatycznej informacji sterowanej głosem – Kolejna rewolucja w IT p...Systemy automatycznej informacji sterowanej głosem – Kolejna rewolucja w IT p...
Systemy automatycznej informacji sterowanej głosem – Kolejna rewolucja w IT p...3camp
 
Odtwarzanie multimediów w HTML5, czyli Player przez duże „P”
Odtwarzanie multimediów w HTML5, czyli Player przez duże „P”Odtwarzanie multimediów w HTML5, czyli Player przez duże „P”
Odtwarzanie multimediów w HTML5, czyli Player przez duże „P”3camp
 
Jak udokumentować bazę danych
Jak udokumentować bazę danychJak udokumentować bazę danych
Jak udokumentować bazę danych3camp
 
Ochrona podatnych webaplikacji za pomocą wirtualnych poprawek
Ochrona podatnych webaplikacji za pomocą wirtualnych poprawekOchrona podatnych webaplikacji za pomocą wirtualnych poprawek
Ochrona podatnych webaplikacji za pomocą wirtualnych poprawek3camp
 
Reakcja łańcuchowa, czyli React.js w praktyce
Reakcja łańcuchowa, czyli React.js w praktyceReakcja łańcuchowa, czyli React.js w praktyce
Reakcja łańcuchowa, czyli React.js w praktyce3camp
 
HTTPS bez wymówek
HTTPS bez wymówekHTTPS bez wymówek
HTTPS bez wymówek3camp
 

En vedette (7)

No pressure, no diamonds. Rzecz o łamaniu zasad w projektach.
No pressure, no diamonds. Rzecz o łamaniu zasad w projektach.No pressure, no diamonds. Rzecz o łamaniu zasad w projektach.
No pressure, no diamonds. Rzecz o łamaniu zasad w projektach.
 
Systemy automatycznej informacji sterowanej głosem – Kolejna rewolucja w IT p...
Systemy automatycznej informacji sterowanej głosem – Kolejna rewolucja w IT p...Systemy automatycznej informacji sterowanej głosem – Kolejna rewolucja w IT p...
Systemy automatycznej informacji sterowanej głosem – Kolejna rewolucja w IT p...
 
Odtwarzanie multimediów w HTML5, czyli Player przez duże „P”
Odtwarzanie multimediów w HTML5, czyli Player przez duże „P”Odtwarzanie multimediów w HTML5, czyli Player przez duże „P”
Odtwarzanie multimediów w HTML5, czyli Player przez duże „P”
 
Jak udokumentować bazę danych
Jak udokumentować bazę danychJak udokumentować bazę danych
Jak udokumentować bazę danych
 
Ochrona podatnych webaplikacji za pomocą wirtualnych poprawek
Ochrona podatnych webaplikacji za pomocą wirtualnych poprawekOchrona podatnych webaplikacji za pomocą wirtualnych poprawek
Ochrona podatnych webaplikacji za pomocą wirtualnych poprawek
 
Reakcja łańcuchowa, czyli React.js w praktyce
Reakcja łańcuchowa, czyli React.js w praktyceReakcja łańcuchowa, czyli React.js w praktyce
Reakcja łańcuchowa, czyli React.js w praktyce
 
HTTPS bez wymówek
HTTPS bez wymówekHTTPS bez wymówek
HTTPS bez wymówek
 

Similaire à Kotlin Experience Damian Petla

Java: Nie popełniaj tych błędów!
Java: Nie popełniaj tych błędów!Java: Nie popełniaj tych błędów!
Java: Nie popełniaj tych błędów!Daniel Pokusa
 
Meetup di GDG Italia - Leonardo Pirro - Codemotion Rome 2018
Meetup di GDG Italia - Leonardo Pirro -  Codemotion Rome 2018 Meetup di GDG Italia - Leonardo Pirro -  Codemotion Rome 2018
Meetup di GDG Italia - Leonardo Pirro - Codemotion Rome 2018 Codemotion
 
Empathic Programming - How to write comprehensible code
Empathic Programming - How to write comprehensible codeEmpathic Programming - How to write comprehensible code
Empathic Programming - How to write comprehensible codeMario Gleichmann
 
Pure Kotlin Devoxx PL 2021
Pure Kotlin Devoxx PL 2021Pure Kotlin Devoxx PL 2021
Pure Kotlin Devoxx PL 2021Jarek Ratajski
 
First few months with Kotlin - Introduction through android examples
First few months with Kotlin - Introduction through android examplesFirst few months with Kotlin - Introduction through android examples
First few months with Kotlin - Introduction through android examplesNebojša Vukšić
 
Madrid gug - sacando partido a las transformaciones ast de groovy
Madrid gug - sacando partido a las transformaciones ast de groovyMadrid gug - sacando partido a las transformaciones ast de groovy
Madrid gug - sacando partido a las transformaciones ast de groovyIván López Martín
 
Greach 2015 AST – Groovy Transformers: More than meets the eye!
Greach 2015   AST – Groovy Transformers: More than meets the eye!Greach 2015   AST – Groovy Transformers: More than meets the eye!
Greach 2015 AST – Groovy Transformers: More than meets the eye!Iván López Martín
 
G3 Summit 2016 - Taking Advantage of Groovy Annotations
G3 Summit 2016 - Taking Advantage of Groovy AnnotationsG3 Summit 2016 - Taking Advantage of Groovy Annotations
G3 Summit 2016 - Taking Advantage of Groovy AnnotationsIván López Martín
 
Persisting Data on SQLite using Room
Persisting Data on SQLite using RoomPersisting Data on SQLite using Room
Persisting Data on SQLite using RoomNelson Glauber Leal
 
Hive Functions Cheat Sheet
Hive Functions Cheat SheetHive Functions Cheat Sheet
Hive Functions Cheat SheetHortonworks
 
Storm - As deep into real-time data processing as you can get in 30 minutes.
Storm - As deep into real-time data processing as you can get in 30 minutes.Storm - As deep into real-time data processing as you can get in 30 minutes.
Storm - As deep into real-time data processing as you can get in 30 minutes.Dan Lynn
 
From java to kotlin beyond alt+shift+cmd+k - Droidcon italy
From java to kotlin beyond alt+shift+cmd+k - Droidcon italyFrom java to kotlin beyond alt+shift+cmd+k - Droidcon italy
From java to kotlin beyond alt+shift+cmd+k - Droidcon italyFabio Collini
 
CodeCamp Iasi 10 march 2012 - Practical Groovy
CodeCamp Iasi 10 march 2012 - Practical GroovyCodeCamp Iasi 10 march 2012 - Practical Groovy
CodeCamp Iasi 10 march 2012 - Practical GroovyCodecamp Romania
 
Kotlin for Android Developers - Victor Kropp - Codemotion Rome 2018
Kotlin for Android Developers - Victor Kropp - Codemotion Rome 2018Kotlin for Android Developers - Victor Kropp - Codemotion Rome 2018
Kotlin for Android Developers - Victor Kropp - Codemotion Rome 2018Codemotion
 
Kotlin Basics - Apalon Kotlin Sprint Part 2
Kotlin Basics - Apalon Kotlin Sprint Part 2Kotlin Basics - Apalon Kotlin Sprint Part 2
Kotlin Basics - Apalon Kotlin Sprint Part 2Kirill Rozov
 
Kotlin Austin Droids April 14 2016
Kotlin Austin Droids April 14 2016Kotlin Austin Droids April 14 2016
Kotlin Austin Droids April 14 2016DesertJames
 
#살아있다 #자프링외길12년차 #코프링2개월생존기
#살아있다 #자프링외길12년차 #코프링2개월생존기#살아있다 #자프링외길12년차 #코프링2개월생존기
#살아있다 #자프링외길12년차 #코프링2개월생존기Arawn Park
 
Idioms in swift 2016 05c
Idioms in swift 2016 05cIdioms in swift 2016 05c
Idioms in swift 2016 05cKaz Yoshikawa
 

Similaire à Kotlin Experience Damian Petla (20)

Java: Nie popełniaj tych błędów!
Java: Nie popełniaj tych błędów!Java: Nie popełniaj tych błędów!
Java: Nie popełniaj tych błędów!
 
Pure kotlin
Pure kotlinPure kotlin
Pure kotlin
 
Meetup di GDG Italia - Leonardo Pirro - Codemotion Rome 2018
Meetup di GDG Italia - Leonardo Pirro -  Codemotion Rome 2018 Meetup di GDG Italia - Leonardo Pirro -  Codemotion Rome 2018
Meetup di GDG Italia - Leonardo Pirro - Codemotion Rome 2018
 
Empathic Programming - How to write comprehensible code
Empathic Programming - How to write comprehensible codeEmpathic Programming - How to write comprehensible code
Empathic Programming - How to write comprehensible code
 
Pure Kotlin Devoxx PL 2021
Pure Kotlin Devoxx PL 2021Pure Kotlin Devoxx PL 2021
Pure Kotlin Devoxx PL 2021
 
First few months with Kotlin - Introduction through android examples
First few months with Kotlin - Introduction through android examplesFirst few months with Kotlin - Introduction through android examples
First few months with Kotlin - Introduction through android examples
 
Madrid gug - sacando partido a las transformaciones ast de groovy
Madrid gug - sacando partido a las transformaciones ast de groovyMadrid gug - sacando partido a las transformaciones ast de groovy
Madrid gug - sacando partido a las transformaciones ast de groovy
 
Greach 2015 AST – Groovy Transformers: More than meets the eye!
Greach 2015   AST – Groovy Transformers: More than meets the eye!Greach 2015   AST – Groovy Transformers: More than meets the eye!
Greach 2015 AST – Groovy Transformers: More than meets the eye!
 
G3 Summit 2016 - Taking Advantage of Groovy Annotations
G3 Summit 2016 - Taking Advantage of Groovy AnnotationsG3 Summit 2016 - Taking Advantage of Groovy Annotations
G3 Summit 2016 - Taking Advantage of Groovy Annotations
 
Persisting Data on SQLite using Room
Persisting Data on SQLite using RoomPersisting Data on SQLite using Room
Persisting Data on SQLite using Room
 
Miracle of std lib
Miracle of std libMiracle of std lib
Miracle of std lib
 
Hive Functions Cheat Sheet
Hive Functions Cheat SheetHive Functions Cheat Sheet
Hive Functions Cheat Sheet
 
Storm - As deep into real-time data processing as you can get in 30 minutes.
Storm - As deep into real-time data processing as you can get in 30 minutes.Storm - As deep into real-time data processing as you can get in 30 minutes.
Storm - As deep into real-time data processing as you can get in 30 minutes.
 
From java to kotlin beyond alt+shift+cmd+k - Droidcon italy
From java to kotlin beyond alt+shift+cmd+k - Droidcon italyFrom java to kotlin beyond alt+shift+cmd+k - Droidcon italy
From java to kotlin beyond alt+shift+cmd+k - Droidcon italy
 
CodeCamp Iasi 10 march 2012 - Practical Groovy
CodeCamp Iasi 10 march 2012 - Practical GroovyCodeCamp Iasi 10 march 2012 - Practical Groovy
CodeCamp Iasi 10 march 2012 - Practical Groovy
 
Kotlin for Android Developers - Victor Kropp - Codemotion Rome 2018
Kotlin for Android Developers - Victor Kropp - Codemotion Rome 2018Kotlin for Android Developers - Victor Kropp - Codemotion Rome 2018
Kotlin for Android Developers - Victor Kropp - Codemotion Rome 2018
 
Kotlin Basics - Apalon Kotlin Sprint Part 2
Kotlin Basics - Apalon Kotlin Sprint Part 2Kotlin Basics - Apalon Kotlin Sprint Part 2
Kotlin Basics - Apalon Kotlin Sprint Part 2
 
Kotlin Austin Droids April 14 2016
Kotlin Austin Droids April 14 2016Kotlin Austin Droids April 14 2016
Kotlin Austin Droids April 14 2016
 
#살아있다 #자프링외길12년차 #코프링2개월생존기
#살아있다 #자프링외길12년차 #코프링2개월생존기#살아있다 #자프링외길12년차 #코프링2개월생존기
#살아있다 #자프링외길12년차 #코프링2개월생존기
 
Idioms in swift 2016 05c
Idioms in swift 2016 05cIdioms in swift 2016 05c
Idioms in swift 2016 05c
 

Plus de 3camp

ORM - tuningujemy podejście do mapowania
ORM - tuningujemy podejście do mapowaniaORM - tuningujemy podejście do mapowania
ORM - tuningujemy podejście do mapowania3camp
 
W poszukiwaniu procesu doskonałego. Wdrożenie Scruma, Continuous Integrations...
W poszukiwaniu procesu doskonałego. Wdrożenie Scruma, Continuous Integrations...W poszukiwaniu procesu doskonałego. Wdrożenie Scruma, Continuous Integrations...
W poszukiwaniu procesu doskonałego. Wdrożenie Scruma, Continuous Integrations...3camp
 
Learn you some rx for the greater good
Learn you some rx for the greater goodLearn you some rx for the greater good
Learn you some rx for the greater good3camp
 
Google App Engine i Google Play Services w Twoich aplikacjach
Google App Engine i Google Play Services w Twoich aplikacjachGoogle App Engine i Google Play Services w Twoich aplikacjach
Google App Engine i Google Play Services w Twoich aplikacjach3camp
 
AngularJS (nie) nadaje się do dużego projektu
AngularJS (nie) nadaje się do dużego projektuAngularJS (nie) nadaje się do dużego projektu
AngularJS (nie) nadaje się do dużego projektu3camp
 
Przemysław Bartkowiak - Sam ustalasz ile za to zapłacisz – czyli nowy wymiar ...
Przemysław Bartkowiak - Sam ustalasz ile za to zapłacisz – czyli nowy wymiar ...Przemysław Bartkowiak - Sam ustalasz ile za to zapłacisz – czyli nowy wymiar ...
Przemysław Bartkowiak - Sam ustalasz ile za to zapłacisz – czyli nowy wymiar ...3camp
 
Mirek Wąsowicz - Segment jednego, dokąd zmierza marketing online?
Mirek Wąsowicz - Segment jednego, dokąd zmierza marketing online?Mirek Wąsowicz - Segment jednego, dokąd zmierza marketing online?
Mirek Wąsowicz - Segment jednego, dokąd zmierza marketing online?3camp
 
Artur Senk, OKE Poland, Big Data na zakupach
Artur Senk, OKE Poland, Big Data na zakupachArtur Senk, OKE Poland, Big Data na zakupach
Artur Senk, OKE Poland, Big Data na zakupach3camp
 
Piotr Macuk, Konfeo.com, Programista i biznes – plusy i minusy własnej działa...
Piotr Macuk, Konfeo.com, Programista i biznes – plusy i minusy własnej działa...Piotr Macuk, Konfeo.com, Programista i biznes – plusy i minusy własnej działa...
Piotr Macuk, Konfeo.com, Programista i biznes – plusy i minusy własnej działa...3camp
 
Marcin Maj, Kainos - QA – wartko, zmiennie i interdyscyplinarnie
Marcin Maj, Kainos - QA – wartko, zmiennie i interdyscyplinarnieMarcin Maj, Kainos - QA – wartko, zmiennie i interdyscyplinarnie
Marcin Maj, Kainos - QA – wartko, zmiennie i interdyscyplinarnie3camp
 
Jak przesiąść się na rower na dwóch kółkach? Od trzyosobowego startupu do spó...
Jak przesiąść się na rower na dwóch kółkach? Od trzyosobowego startupu do spó...Jak przesiąść się na rower na dwóch kółkach? Od trzyosobowego startupu do spó...
Jak przesiąść się na rower na dwóch kółkach? Od trzyosobowego startupu do spó...3camp
 
Łukasz Brzeziński - Jak zarabiać z Wikingami? Czyli monetyzacja portalu inter...
Łukasz Brzeziński - Jak zarabiać z Wikingami? Czyli monetyzacja portalu inter...Łukasz Brzeziński - Jak zarabiać z Wikingami? Czyli monetyzacja portalu inter...
Łukasz Brzeziński - Jak zarabiać z Wikingami? Czyli monetyzacja portalu inter...3camp
 
Marcin Szeląg, InnovationNest, Startup Risk Model
Marcin Szeląg, InnovationNest, Startup Risk ModelMarcin Szeląg, InnovationNest, Startup Risk Model
Marcin Szeląg, InnovationNest, Startup Risk Model3camp
 
JSON, REST API
JSON, REST APIJSON, REST API
JSON, REST API3camp
 
Ostatnia faza produktu: co się dzieję kiedy programista zakończył swoje zadanie
Ostatnia faza produktu: co się dzieję kiedy programista zakończył swoje zadanieOstatnia faza produktu: co się dzieję kiedy programista zakończył swoje zadanie
Ostatnia faza produktu: co się dzieję kiedy programista zakończył swoje zadanie3camp
 
Oculus Rift – zanurzenie w przyszłość
Oculus Rift – zanurzenie w przyszłośćOculus Rift – zanurzenie w przyszłość
Oculus Rift – zanurzenie w przyszłość3camp
 
Druk 3d w służbie medycyny i przemysłu
 Druk 3d w służbie medycyny i przemysłu Druk 3d w służbie medycyny i przemysłu
Druk 3d w służbie medycyny i przemysłu3camp
 
Bitcoin – waluta globalna
Bitcoin – waluta globalnaBitcoin – waluta globalna
Bitcoin – waluta globalna3camp
 
Is social media next waste?
Is social media next waste?Is social media next waste?
Is social media next waste?3camp
 
W poszukiwaniu właściwych pytań i jednoznacznych odpowiedzi. Analiza biznesow...
W poszukiwaniu właściwych pytań i jednoznacznych odpowiedzi. Analiza biznesow...W poszukiwaniu właściwych pytań i jednoznacznych odpowiedzi. Analiza biznesow...
W poszukiwaniu właściwych pytań i jednoznacznych odpowiedzi. Analiza biznesow...3camp
 

Plus de 3camp (20)

ORM - tuningujemy podejście do mapowania
ORM - tuningujemy podejście do mapowaniaORM - tuningujemy podejście do mapowania
ORM - tuningujemy podejście do mapowania
 
W poszukiwaniu procesu doskonałego. Wdrożenie Scruma, Continuous Integrations...
W poszukiwaniu procesu doskonałego. Wdrożenie Scruma, Continuous Integrations...W poszukiwaniu procesu doskonałego. Wdrożenie Scruma, Continuous Integrations...
W poszukiwaniu procesu doskonałego. Wdrożenie Scruma, Continuous Integrations...
 
Learn you some rx for the greater good
Learn you some rx for the greater goodLearn you some rx for the greater good
Learn you some rx for the greater good
 
Google App Engine i Google Play Services w Twoich aplikacjach
Google App Engine i Google Play Services w Twoich aplikacjachGoogle App Engine i Google Play Services w Twoich aplikacjach
Google App Engine i Google Play Services w Twoich aplikacjach
 
AngularJS (nie) nadaje się do dużego projektu
AngularJS (nie) nadaje się do dużego projektuAngularJS (nie) nadaje się do dużego projektu
AngularJS (nie) nadaje się do dużego projektu
 
Przemysław Bartkowiak - Sam ustalasz ile za to zapłacisz – czyli nowy wymiar ...
Przemysław Bartkowiak - Sam ustalasz ile za to zapłacisz – czyli nowy wymiar ...Przemysław Bartkowiak - Sam ustalasz ile za to zapłacisz – czyli nowy wymiar ...
Przemysław Bartkowiak - Sam ustalasz ile za to zapłacisz – czyli nowy wymiar ...
 
Mirek Wąsowicz - Segment jednego, dokąd zmierza marketing online?
Mirek Wąsowicz - Segment jednego, dokąd zmierza marketing online?Mirek Wąsowicz - Segment jednego, dokąd zmierza marketing online?
Mirek Wąsowicz - Segment jednego, dokąd zmierza marketing online?
 
Artur Senk, OKE Poland, Big Data na zakupach
Artur Senk, OKE Poland, Big Data na zakupachArtur Senk, OKE Poland, Big Data na zakupach
Artur Senk, OKE Poland, Big Data na zakupach
 
Piotr Macuk, Konfeo.com, Programista i biznes – plusy i minusy własnej działa...
Piotr Macuk, Konfeo.com, Programista i biznes – plusy i minusy własnej działa...Piotr Macuk, Konfeo.com, Programista i biznes – plusy i minusy własnej działa...
Piotr Macuk, Konfeo.com, Programista i biznes – plusy i minusy własnej działa...
 
Marcin Maj, Kainos - QA – wartko, zmiennie i interdyscyplinarnie
Marcin Maj, Kainos - QA – wartko, zmiennie i interdyscyplinarnieMarcin Maj, Kainos - QA – wartko, zmiennie i interdyscyplinarnie
Marcin Maj, Kainos - QA – wartko, zmiennie i interdyscyplinarnie
 
Jak przesiąść się na rower na dwóch kółkach? Od trzyosobowego startupu do spó...
Jak przesiąść się na rower na dwóch kółkach? Od trzyosobowego startupu do spó...Jak przesiąść się na rower na dwóch kółkach? Od trzyosobowego startupu do spó...
Jak przesiąść się na rower na dwóch kółkach? Od trzyosobowego startupu do spó...
 
Łukasz Brzeziński - Jak zarabiać z Wikingami? Czyli monetyzacja portalu inter...
Łukasz Brzeziński - Jak zarabiać z Wikingami? Czyli monetyzacja portalu inter...Łukasz Brzeziński - Jak zarabiać z Wikingami? Czyli monetyzacja portalu inter...
Łukasz Brzeziński - Jak zarabiać z Wikingami? Czyli monetyzacja portalu inter...
 
Marcin Szeląg, InnovationNest, Startup Risk Model
Marcin Szeląg, InnovationNest, Startup Risk ModelMarcin Szeląg, InnovationNest, Startup Risk Model
Marcin Szeląg, InnovationNest, Startup Risk Model
 
JSON, REST API
JSON, REST APIJSON, REST API
JSON, REST API
 
Ostatnia faza produktu: co się dzieję kiedy programista zakończył swoje zadanie
Ostatnia faza produktu: co się dzieję kiedy programista zakończył swoje zadanieOstatnia faza produktu: co się dzieję kiedy programista zakończył swoje zadanie
Ostatnia faza produktu: co się dzieję kiedy programista zakończył swoje zadanie
 
Oculus Rift – zanurzenie w przyszłość
Oculus Rift – zanurzenie w przyszłośćOculus Rift – zanurzenie w przyszłość
Oculus Rift – zanurzenie w przyszłość
 
Druk 3d w służbie medycyny i przemysłu
 Druk 3d w służbie medycyny i przemysłu Druk 3d w służbie medycyny i przemysłu
Druk 3d w służbie medycyny i przemysłu
 
Bitcoin – waluta globalna
Bitcoin – waluta globalnaBitcoin – waluta globalna
Bitcoin – waluta globalna
 
Is social media next waste?
Is social media next waste?Is social media next waste?
Is social media next waste?
 
W poszukiwaniu właściwych pytań i jednoznacznych odpowiedzi. Analiza biznesow...
W poszukiwaniu właściwych pytań i jednoznacznych odpowiedzi. Analiza biznesow...W poszukiwaniu właściwych pytań i jednoznacznych odpowiedzi. Analiza biznesow...
W poszukiwaniu właściwych pytań i jednoznacznych odpowiedzi. Analiza biznesow...
 

Dernier

Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationBeyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationSafe Software
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupFlorian Wilhelm
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Enterprise Knowledge
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...Fwdays
 
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr LapshynFwdays
 
Powerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time ClashPowerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time Clashcharlottematthew16
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLScyllaDB
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brandgvaughan
 
Gen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfGen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfAddepto
 
Training state-of-the-art general text embedding
Training state-of-the-art general text embeddingTraining state-of-the-art general text embedding
Training state-of-the-art general text embeddingZilliz
 
My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024The Digital Insurer
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek SchlawackFwdays
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyAlfredo García Lavilla
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 3652toLead Limited
 
Search Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdfSearch Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdfRankYa
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Commit University
 
Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machinePadma Pradeep
 
SAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxSAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxNavinnSomaal
 

Dernier (20)

Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationBeyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project Setup
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
 
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
 
Powerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time ClashPowerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time Clash
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQL
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brand
 
Gen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfGen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdf
 
Training state-of-the-art general text embedding
Training state-of-the-art general text embeddingTraining state-of-the-art general text embedding
Training state-of-the-art general text embedding
 
My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easy
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365
 
Search Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdfSearch Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdf
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!
 
Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machine
 
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptxE-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
 
SAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxSAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptx
 

Kotlin Experience Damian Petla

  • 2. DAMIAN PETLA ANDROID DEVELOPER e-mail: damian.petla@schibsted.pl LinkedIn: pl.linkedin.com/in/damianpetla
  • 3.
  • 4. 1. DLACZEGO WYBRAŁEM KOTLINA? CIEKAWOŚĆ CODE REVIEW Z iOS JETBRAINS - ZNANA MARKA ROZMIAR APK I SZYBKA KOMPILACJA
  • 5. 2. CZY TRUDNO JEST ZACZĄĆ? 50 GODZIN SKŁADNIA NOWE PODEJŚCIE
  • 6. class User(val name: String, age: Int?) val name: String = “Damian” var isSuperUser: Boolean = true var pet: String? = null public fun sayHi(name: String, times: Int = 3) { for (i in 1..times) { println(“Hi $name”) } } private fun getSome() : String { return “some” } Kotlin
  • 7. 3. CO NAJBARDZIEJ MI SIĘ PODOBA W KOTLINIE? BEZPIECZNY KOD
  • 8. InputStream stream = ... if (stream != null) { stream.close(); } stream.close() stream?.close() Java Kotlin
  • 9. 3. CO NAJBARDZIEJ MI SIĘ PODOBA W KOTLINIE? BEZPIECZNY KOD PROSTE DEFINICJE KLAS
  • 10. public class Item { private String type; public Item(String type) { this.type = type; } public String getType() { return type; } public void setType(String type) { this.type = type; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Item item2 = (Item) o; if (type != null ? !type.equals(item2.type) : item2.type != null) return false; return true; } @Override public int hashCode() { return type != null ? type.hashCode() : 0; } @Override public String toString() { return "Item2{" + "type='" + type + ''' + '}'; } } public class Article extends Item { private Boolean isDeleted; private String id; private String category; private String published; private String publishedFormatted; private String firstPublished; private String updated; private String created; private List<Topic> topics; private String title; private String newsLifetime; private Integer newsValue; private List<Author> authors; private List<Resource> resources private Version version; private String vignette; private String displaySize; private Boolean live; private Boolean breaking; private Story story; private Boolean sponsored = false; public Article(String type) { super(type); } public Article(String type, Boolean isDeleted, String id, String category, String published, String publishedFormatted, String firstPublished, String updated, String created, List<Topic> topics, String title, String newsLifetime, Integer newsValue, List<Author> authors, List<Resource> resources, Version version, String vignette, String displaySize, Boolean live, Boolean breaking, Story story, Boolean sponsored) { super(type); this.isDeleted = isDeleted; this.id = id; this.category = category; this.published = published; this.publishedFormatted = publishedFormatted; this.firstPublished = firstPublished; this.updated = updated; this.created = created; this.topics = topics; this.title = title; this.newsLifetime = newsLifetime; this.newsValue = newsValue; this.authors = authors; this.resources = resources; this.version = version; this.vignette = vignette; this.displaySize = displaySize; this.live = live; this.breaking = breaking; this.story = story; this.sponsored = sponsored; } public Boolean getIsDeleted() { return isDeleted; } public void setIsDeleted(Boolean isDeleted) { this.isDeleted = isDeleted; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getCategory() { return category; } public void setCategory(String category) { this.category = category; } public String getPublished() { return published; } public void setPublished(String published) { this.published = published; } public String getPublishedFormatted() { return publishedFormatted; } public void setPublishedFormatted(String publishedFormatted) { this.publishedFormatted = publishedFormatted; } public String getFirstPublished() { return firstPublished; } public void setFirstPublished(String firstPublished) { this.firstPublished = firstPublished; } public String getUpdated() { return updated; } public void setUpdated(String updated) { this.updated = updated; } public String getCreated() { return created; } public void setCreated(String created) { this.created = created; } public List<Topic> getTopics() { return topics; } public void setTopics(List<Topic> topics) { this.topics = topics; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getNewsLifetime() { return newsLifetime; } public void setNewsLifetime(String newsLifetime) { this.newsLifetime = newsLifetime; } public Integer getNewsValue() { return newsValue; } public void setNewsValue(Integer newsValue) { this.newsValue = newsValue; } public List<Author> getAuthors() { return authors; } public void setAuthors(List<Author> authors) { this.authors = authors; } public List<Resource> getResources() { return resources; } public void setResources(List<Resource> resources) { this.resources = resources; } public Version getVersion() { return version; } public void setVersion(Version version) { this.version = version; } public String getVignette() { return vignette; } public void setVignette(String vignette) { this.vignette = vignette; } public String getDisplaySize() { return displaySize; } public void setDisplaySize(String displaySize) { this.displaySize = displaySize; } public Boolean getLive() { return live; } public void setLive(Boolean live) { this.live = live; } public Boolean getBreaking() { return breaking; } public void setBreaking(Boolean breaking) { this.breaking = breaking; } public Story getStory() { return story; } public void setStory(Story story) { this.story = story; } public Boolean getSponsored() { return sponsored; } public void setSponsored(Boolean sponsored) { this.sponsored = sponsored; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; if (!super.equals(o)) return false; Article article2 = (Article) o; if (authors != null ? !authors.equals(article2.authors) : article2.authors != null) return false; if (breaking != null ? !breaking.equals(article2.breaking) : article2.breaking != null) return false; if (category != null ? !category.equals(article2.category) : article2.category != null) return false; if (created != null ? !created.equals(article2.created) : article2.created != null) return false; if (displaySize != null ? !displaySize.equals(article2.displaySize) : article2.displaySize != null) return false; if (firstPublished != null ? !firstPublished.equals(article2.firstPublished) : article2.firstPublished != null) return false; if (id != null ? !id.equals(article2.id) : article2.id != null) return false; if (isDeleted != null ? !isDeleted.equals(article2.isDeleted) : article2.isDeleted != null) return false; if (live != null ? !live.equals(article2.live) : article2.live != null) return false; if (newsLifetime != null ? !newsLifetime.equals(article2.newsLifetime) : article2.newsLifetime != null) return false; if (newsValue != null ? !newsValue.equals(article2.newsValue) : article2.newsValue != null) return false; if (published != null ? !published.equals(article2.published) : article2.published != null) return false; if (publishedFormatted != null ? !publishedFormatted.equals(article2.publishedFormatted) : article2.publishedFormatted != null) return false; if (resources != null ? !resources.equals(article2.resources) : article2.resources != null) return false; if (sponsored != null ? !sponsored.equals(article2.sponsored) : article2.sponsored != null) return false; if (story != null ? !story.equals(article2.story) : article2.story != null) return false; if (title != null ? !title.equals(article2.title) : article2.title != null) return false; if (topics != null ? !topics.equals(article2.topics) : article2.topics != null) return false; if (updated != null ? !updated.equals(article2.updated) : article2.updated != null) return false; if (version != null ? !version.equals(article2.version) : article2.version != null) return false; if (vignette != null ? !vignette.equals(article2.vignette) : article2.vignette != null) return false; return true; } @Override public int hashCode() { int result = super.hashCode(); result = 31 * result + (isDeleted != null ? isDeleted.hashCode() : 0); result = 31 * result + (id != null ? id.hashCode() : 0); result = 31 * result + (category != null ? category.hashCode() : 0); result = 31 * result + (published != null ? published.hashCode() : 0); result = 31 * result + (publishedFormatted != null ? publishedFormatted.hashCode() : 0); result = 31 * result + (firstPublished != null ? firstPublished.hashCode() : 0); result = 31 * result + (updated != null ? updated.hashCode() : 0); result = 31 * result + (created != null ? created.hashCode() : 0); result = 31 * result + (topics != null ? topics.hashCode() : 0); result = 31 * result + (title != null ? title.hashCode() : 0); result = 31 * result + (newsLifetime != null ? newsLifetime.hashCode() : 0); result = 31 * result + (newsValue != null ? newsValue.hashCode() : 0); result = 31 * result + (authors != null ? authors.hashCode() : 0); result = 31 * result + (resources != null ? resources.hashCode() : 0); result = 31 * result + (version != null ? version.hashCode() : 0); result = 31 * result + (vignette != null ? vignette.hashCode() : 0); result = 31 * result + (displaySize != null ? displaySize.hashCode() : 0); result = 31 * result + (live != null ? live.hashCode() : 0); result = 31 * result + (breaking != null ? breaking.hashCode() : 0); result = 31 * result + (story != null ? story.hashCode() : 0); result = 31 * result + (sponsored != null ? sponsored.hashCode() : 0); return result; } @Override public String toString() { return "Article{" + open class Item(val type: ItemTypeEnum): Serializable data class Article(type: ItemTypeEnum, val isDeleted: Boolean?, val id: String, val category: String, val published: String, var publishedFormatted: String?, val firstPublished: String?, val updated: String, val created: String, val topics: Array<Topic>, val title: String, val newsLifetime: String, val newsValue: Int, val authors: Array<Author>, val resources: Array<Resource>, val version: Version?, val vignette: String?, val displaySize: String, val live: Boolean?, val breaking: Boolean?, val story: Story?, val sponsored: Boolean = false ) : Item(type) Java - 354 Kotlin - 25
  • 11. data class User(val name: String, val surname: String, val age: Int) val user = User(“Damian”, “Petla”, 33) val user2 = user.copy(age = 30, name = “Adam”) println(user) println(user2) User(name=Damian, surname=Petla, age=33) User(name=Adam, surname=Petla, age=30) Kotlin Log
  • 12. 3. CO NAJBARDZIEJ MI SIĘ PODOBA W KOTLINIE? BEZPIECZNY KOD PROSTE DEFINICJE KLAS LAMBDA STRING TEMPLATES
  • 13. Button button = (Button) findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { System.out.println(“Hello! " + v.isOpaque()); } }); Java Kotlin val button = findViewById(R.id.button) as Button button.setOnClickListener { println("Hello! ${it.isOpaque()}") }
  • 14. 3. CO NAJBARDZIEJ MI SIĘ PODOBA W KOTLINIE? BEZPIECZNY KOD PROSTE DEFINICJE KLAS LAMBDA STRING TEMPLATES SMART CAST
  • 15. int l = 0; if (obj instanceof String) { l = ((String)obj).length; } Java Kotlin var l = 0 if (obj is String) { l = obj.length } val l : Int = (obj as? String)?.length ?: 0
  • 16. 3. CO NAJBARDZIEJ MI SIĘ PODOBA W KOTLINIE? BEZPIECZNY KOD PROSTE DEFINICJE KLAS LAMBDA STRING TEMPLATES SMART CAST FUNCTION EXTENSIONS
  • 17. String utcDate = ... String formatted = Utilites.toPrettyDate(utcDate); textView.setText(formatted); Java Kotlin textView.setText(utcDate.toPrettyDate()) fun String.toPrettyDate(): String { return “$this is formatted now” }
  • 18. 4. CZY SĄ JAKIEŚ PROBLEMY Z KOTLINEM? SZYBKA ODPOWIEDŹ NA ZGŁOSZONE BŁEDY JETBRAINS AKTYWNY NA STACK OVERFLOW 220 BUGÓW NAPRAWIONYCH W WERSJI M11(0.11.91)
  • 19.
  • 22. 5. OD CZEGO ZACZĄĆ NAUKĘ?
  • 26. 6. KTO UŻYWA KOTLINA?
  • 27. 7. CZY MAM JAKIEŚ PORADY NA POCZĄTEK? !! ZAMIAST ? CZĘSTO WRACAJ DO DOKUMENTACJI UDZIELAJ SIĘ W COMMUNITY
  • 28. Q & A