SlideShare a Scribd company logo
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

More Related Content

What's hot

Kotlin standard
Kotlin standardKotlin standard
Kotlin standard
Myeongin Woo
 
Mining the social web ch1
Mining the social web ch1Mining the social web ch1
Mining the social web ch1
HyeonSeok 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 Level
Blythe 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 1
coto
 
{tidygraph}と{ggraph}による モダンなネットワーク分析(未公開ver)
{tidygraph}と{ggraph}による モダンなネットワーク分析(未公開ver){tidygraph}と{ggraph}による モダンなネットワーク分析(未公開ver)
{tidygraph}と{ggraph}による モダンなネットワーク分析(未公開ver)
Takashi Kitano
 
What's new in C# 6?
What's new in C# 6?What's new in C# 6?
What's new in C# 6?
James Montemagno
 
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
 
Benefits of Kotlin
Benefits of KotlinBenefits of Kotlin
Benefits of Kotlin
Benjamin Waye
 

What's hot (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
 

Viewers also liked

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ę danych
3camp
 
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
3camp
 
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
3camp
 
HTTPS bez wymówek
HTTPS bez wymówekHTTPS bez wymówek
HTTPS bez wymówek
3camp
 

Viewers also liked (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
 

Similar to Wykorzystanie języka Kotlin do aplikacji na platformie Android

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
 
Pure kotlin
Pure kotlinPure kotlin
Pure kotlin
Jarek Ratajski
 
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 code
Mario Gleichmann
 
Pure Kotlin Devoxx PL 2021
Pure Kotlin Devoxx PL 2021Pure Kotlin Devoxx PL 2021
Pure Kotlin Devoxx PL 2021
Jarek 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 examples
Nebojš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 groovy
Ivá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 Annotations
Ivá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 Room
Nelson Glauber Leal
 
Miracle of std lib
Miracle of std libMiracle of std lib
Miracle of std lib
Jedsada Tiwongvokul
 
Hive Functions Cheat Sheet
Hive Functions Cheat SheetHive Functions Cheat Sheet
Hive Functions Cheat Sheet
Hortonworks
 
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 italy
Fabio 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 2018
Codemotion
 
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
Kirill Rozov
 
Kotlin Austin Droids April 14 2016
Kotlin Austin Droids April 14 2016Kotlin Austin Droids April 14 2016
Kotlin Austin Droids April 14 2016
DesertJames
 
#살아있다 #자프링외길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 05c
Kaz Yoshikawa
 

Similar to Wykorzystanie języka Kotlin do aplikacji na platformie Android (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
 

More from 3camp

ORM - tuningujemy podejście do mapowania
ORM - tuningujemy podejście do mapowaniaORM - tuningujemy podejście do mapowania
ORM - tuningujemy podejście do mapowania
3camp
 
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 good
3camp
 
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
3camp
 
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
3camp
 
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 zakupach
3camp
 
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 interdyscyplinarnie
3camp
 
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 API
3camp
 
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
3camp
 
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łu
3camp
 
Bitcoin – waluta globalna
Bitcoin – waluta globalnaBitcoin – waluta globalna
Bitcoin – waluta globalna
3camp
 
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
 

More from 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...
 

Recently uploaded

Epistemic Interaction - tuning interfaces to provide information for AI support
Epistemic Interaction - tuning interfaces to provide information for AI supportEpistemic Interaction - tuning interfaces to provide information for AI support
Epistemic Interaction - tuning interfaces to provide information for AI support
Alan Dix
 
Goodbye Windows 11: Make Way for Nitrux Linux 3.5.0!
Goodbye Windows 11: Make Way for Nitrux Linux 3.5.0!Goodbye Windows 11: Make Way for Nitrux Linux 3.5.0!
Goodbye Windows 11: Make Way for Nitrux Linux 3.5.0!
SOFTTECHHUB
 
The Art of the Pitch: WordPress Relationships and Sales
The Art of the Pitch: WordPress Relationships and SalesThe Art of the Pitch: WordPress Relationships and Sales
The Art of the Pitch: WordPress Relationships and Sales
Laura Byrne
 
20240609 QFM020 Irresponsible AI Reading List May 2024
20240609 QFM020 Irresponsible AI Reading List May 202420240609 QFM020 Irresponsible AI Reading List May 2024
20240609 QFM020 Irresponsible AI Reading List May 2024
Matthew Sinclair
 
GraphSummit Singapore | Enhancing Changi Airport Group's Passenger Experience...
GraphSummit Singapore | Enhancing Changi Airport Group's Passenger Experience...GraphSummit Singapore | Enhancing Changi Airport Group's Passenger Experience...
GraphSummit Singapore | Enhancing Changi Airport Group's Passenger Experience...
Neo4j
 
20240605 QFM017 Machine Intelligence Reading List May 2024
20240605 QFM017 Machine Intelligence Reading List May 202420240605 QFM017 Machine Intelligence Reading List May 2024
20240605 QFM017 Machine Intelligence Reading List May 2024
Matthew Sinclair
 
GraphSummit Singapore | The Future of Agility: Supercharging Digital Transfor...
GraphSummit Singapore | The Future of Agility: Supercharging Digital Transfor...GraphSummit Singapore | The Future of Agility: Supercharging Digital Transfor...
GraphSummit Singapore | The Future of Agility: Supercharging Digital Transfor...
Neo4j
 
Introduction to CHERI technology - Cybersecurity
Introduction to CHERI technology - CybersecurityIntroduction to CHERI technology - Cybersecurity
Introduction to CHERI technology - Cybersecurity
mikeeftimakis1
 
UiPath Test Automation using UiPath Test Suite series, part 5
UiPath Test Automation using UiPath Test Suite series, part 5UiPath Test Automation using UiPath Test Suite series, part 5
UiPath Test Automation using UiPath Test Suite series, part 5
DianaGray10
 
Secstrike : Reverse Engineering & Pwnable tools for CTF.pptx
Secstrike : Reverse Engineering & Pwnable tools for CTF.pptxSecstrike : Reverse Engineering & Pwnable tools for CTF.pptx
Secstrike : Reverse Engineering & Pwnable tools for CTF.pptx
nkrafacyberclub
 
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
Albert Hoitingh
 
Essentials of Automations: The Art of Triggers and Actions in FME
Essentials of Automations: The Art of Triggers and Actions in FMEEssentials of Automations: The Art of Triggers and Actions in FME
Essentials of Automations: The Art of Triggers and Actions in FME
Safe Software
 
Communications Mining Series - Zero to Hero - Session 1
Communications Mining Series - Zero to Hero - Session 1Communications Mining Series - Zero to Hero - Session 1
Communications Mining Series - Zero to Hero - Session 1
DianaGray10
 
By Design, not by Accident - Agile Venture Bolzano 2024
By Design, not by Accident - Agile Venture Bolzano 2024By Design, not by Accident - Agile Venture Bolzano 2024
By Design, not by Accident - Agile Venture Bolzano 2024
Pierluigi Pugliese
 
20240607 QFM018 Elixir Reading List May 2024
20240607 QFM018 Elixir Reading List May 202420240607 QFM018 Elixir Reading List May 2024
20240607 QFM018 Elixir Reading List May 2024
Matthew Sinclair
 
How to Get CNIC Information System with Paksim Ga.pptx
How to Get CNIC Information System with Paksim Ga.pptxHow to Get CNIC Information System with Paksim Ga.pptx
How to Get CNIC Information System with Paksim Ga.pptx
danishmna97
 
Observability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdf
Observability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdfObservability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdf
Observability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdf
Paige Cruz
 
みなさんこんにちはこれ何文字まで入るの?40文字以下不可とか本当に意味わからないけどこれ限界文字数書いてないからマジでやばい文字数いけるんじゃないの?えこ...
みなさんこんにちはこれ何文字まで入るの?40文字以下不可とか本当に意味わからないけどこれ限界文字数書いてないからマジでやばい文字数いけるんじゃないの?えこ...みなさんこんにちはこれ何文字まで入るの?40文字以下不可とか本当に意味わからないけどこれ限界文字数書いてないからマジでやばい文字数いけるんじゃないの?えこ...
みなさんこんにちはこれ何文字まで入るの?40文字以下不可とか本当に意味わからないけどこれ限界文字数書いてないからマジでやばい文字数いけるんじゃないの?えこ...
名前 です男
 
Climate Impact of Software Testing at Nordic Testing Days
Climate Impact of Software Testing at Nordic Testing DaysClimate Impact of Software Testing at Nordic Testing Days
Climate Impact of Software Testing at Nordic Testing Days
Kari Kakkonen
 
Alt. GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using ...
Alt. GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using ...Alt. GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using ...
Alt. GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using ...
James Anderson
 

Recently uploaded (20)

Epistemic Interaction - tuning interfaces to provide information for AI support
Epistemic Interaction - tuning interfaces to provide information for AI supportEpistemic Interaction - tuning interfaces to provide information for AI support
Epistemic Interaction - tuning interfaces to provide information for AI support
 
Goodbye Windows 11: Make Way for Nitrux Linux 3.5.0!
Goodbye Windows 11: Make Way for Nitrux Linux 3.5.0!Goodbye Windows 11: Make Way for Nitrux Linux 3.5.0!
Goodbye Windows 11: Make Way for Nitrux Linux 3.5.0!
 
The Art of the Pitch: WordPress Relationships and Sales
The Art of the Pitch: WordPress Relationships and SalesThe Art of the Pitch: WordPress Relationships and Sales
The Art of the Pitch: WordPress Relationships and Sales
 
20240609 QFM020 Irresponsible AI Reading List May 2024
20240609 QFM020 Irresponsible AI Reading List May 202420240609 QFM020 Irresponsible AI Reading List May 2024
20240609 QFM020 Irresponsible AI Reading List May 2024
 
GraphSummit Singapore | Enhancing Changi Airport Group's Passenger Experience...
GraphSummit Singapore | Enhancing Changi Airport Group's Passenger Experience...GraphSummit Singapore | Enhancing Changi Airport Group's Passenger Experience...
GraphSummit Singapore | Enhancing Changi Airport Group's Passenger Experience...
 
20240605 QFM017 Machine Intelligence Reading List May 2024
20240605 QFM017 Machine Intelligence Reading List May 202420240605 QFM017 Machine Intelligence Reading List May 2024
20240605 QFM017 Machine Intelligence Reading List May 2024
 
GraphSummit Singapore | The Future of Agility: Supercharging Digital Transfor...
GraphSummit Singapore | The Future of Agility: Supercharging Digital Transfor...GraphSummit Singapore | The Future of Agility: Supercharging Digital Transfor...
GraphSummit Singapore | The Future of Agility: Supercharging Digital Transfor...
 
Introduction to CHERI technology - Cybersecurity
Introduction to CHERI technology - CybersecurityIntroduction to CHERI technology - Cybersecurity
Introduction to CHERI technology - Cybersecurity
 
UiPath Test Automation using UiPath Test Suite series, part 5
UiPath Test Automation using UiPath Test Suite series, part 5UiPath Test Automation using UiPath Test Suite series, part 5
UiPath Test Automation using UiPath Test Suite series, part 5
 
Secstrike : Reverse Engineering & Pwnable tools for CTF.pptx
Secstrike : Reverse Engineering & Pwnable tools for CTF.pptxSecstrike : Reverse Engineering & Pwnable tools for CTF.pptx
Secstrike : Reverse Engineering & Pwnable tools for CTF.pptx
 
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
 
Essentials of Automations: The Art of Triggers and Actions in FME
Essentials of Automations: The Art of Triggers and Actions in FMEEssentials of Automations: The Art of Triggers and Actions in FME
Essentials of Automations: The Art of Triggers and Actions in FME
 
Communications Mining Series - Zero to Hero - Session 1
Communications Mining Series - Zero to Hero - Session 1Communications Mining Series - Zero to Hero - Session 1
Communications Mining Series - Zero to Hero - Session 1
 
By Design, not by Accident - Agile Venture Bolzano 2024
By Design, not by Accident - Agile Venture Bolzano 2024By Design, not by Accident - Agile Venture Bolzano 2024
By Design, not by Accident - Agile Venture Bolzano 2024
 
20240607 QFM018 Elixir Reading List May 2024
20240607 QFM018 Elixir Reading List May 202420240607 QFM018 Elixir Reading List May 2024
20240607 QFM018 Elixir Reading List May 2024
 
How to Get CNIC Information System with Paksim Ga.pptx
How to Get CNIC Information System with Paksim Ga.pptxHow to Get CNIC Information System with Paksim Ga.pptx
How to Get CNIC Information System with Paksim Ga.pptx
 
Observability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdf
Observability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdfObservability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdf
Observability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdf
 
みなさんこんにちはこれ何文字まで入るの?40文字以下不可とか本当に意味わからないけどこれ限界文字数書いてないからマジでやばい文字数いけるんじゃないの?えこ...
みなさんこんにちはこれ何文字まで入るの?40文字以下不可とか本当に意味わからないけどこれ限界文字数書いてないからマジでやばい文字数いけるんじゃないの?えこ...みなさんこんにちはこれ何文字まで入るの?40文字以下不可とか本当に意味わからないけどこれ限界文字数書いてないからマジでやばい文字数いけるんじゃないの?えこ...
みなさんこんにちはこれ何文字まで入るの?40文字以下不可とか本当に意味わからないけどこれ限界文字数書いてないからマジでやばい文字数いけるんじゃないの?えこ...
 
Climate Impact of Software Testing at Nordic Testing Days
Climate Impact of Software Testing at Nordic Testing DaysClimate Impact of Software Testing at Nordic Testing Days
Climate Impact of Software Testing at Nordic Testing Days
 
Alt. GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using ...
Alt. GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using ...Alt. GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using ...
Alt. GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using ...
 

Wykorzystanie języka Kotlin do aplikacji na platformie Android

  • 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