Java vs Kotlin

Java vs Kotlin

Kotlin is bypassing all other JVM languages with incredible pace. In Android development, it is already the language to use! But Java also evolved in meantime. Let’s look at Kotlin and compare its features side by side.

A8b79d304b5184e5a5b0a109590f6683?s=128

Danny Preussler

June 04, 2019
Tweet

Transcript

  1. Java vs Kotlin Danny Preussler, JNation

  2. @PreusslerBerlin about:me • Java developer since 2003 • Kotlin developer

    since 2016 • Google Developer Expert for Android and Kotlin • Introduced Kotlin at Groupon and Viacom
  3. @PreusslerBerlin sporttotal.tv • We are streaming under- medialised sports •

    Amateur and semi professional football • Professional Volleyball…
  4. @PreusslerBerlin

  5. @PreusslerBerlin

  6. @PreusslerBerlin Kotlin adoption • Languages developers want to learn in

    2019 • https://research.hackerrank.co m/developer-skills/2019
  7. @PreusslerBerlin Kotlin adoption Okt 18, GitHub: 'Kotlin for Android now

    fastest-growing programming language' https://www.zdnet.com/article/microsofts-github-kotlin-for-android- now-fastest-growing-programming-language/
  8. @PreusslerBerlin Kotlin adoption Stackoverflow trends of JVM languages. #kotlin is

    first with a strong growth during the last 2 years.
  9. @PreusslerBerlin Kotlin adoption • JVM Ecosystem Report 2018 (10k questionaires):

    What is the principal JVM language you use for your main applications? • Kotlin edges past Groovy and Scala in language usage on 2.42% https://snyk.io/blog/jvm-ecosystem-report-2018/
  10. @PreusslerBerlin Kotlin adoption • 1.5M+ developers edited Kotlin code in

    2018 • 100M+ lines of Kotlin code • 96,000+ Kotlin GitHub repositories • Android — 1 in 4 apps (from top 1000) uses Kotlin • Server — х2 from 2017 https://www.jetbrains.com/annualreport/2018/community/
  11. @PreusslerBerlin 2010 2011 2012 2013 2014 2015 2016 2017 2018

    2019 The year: 2010 Java6 has been around the 4th year
  12. @PreusslerBerlin 2010 2011 2012 2013 2014 2015 2016 2017 2018

    2019 The year: 2010 Kotlin Development started internally
  13. @PreusslerBerlin 2010 2011 2012 2013 2014 2015 2016 2017 2018

    2019 July 2010 Swift Development started
  14. @PreusslerBerlin 2010 2011 2012 2013 2014 2015 2016 2017 2018

    2019 July 2011 Java 7
  15. @PreusslerBerlin 2010 2011 2012 2013 2014 2015 2016 2017 2018

    2019 July 2011 JetBrains unveiled Project Kotlin
  16. @PreusslerBerlin 2010 2011 2012 2013 2014 2015 2016 2017 2018

    2019 February 2012 JetBrains open sourced Kotlin
  17. @PreusslerBerlin 2010 2011 2012 2013 2014 2015 2016 2017 2018

    2019 March 2014 Java 8
  18. @PreusslerBerlin 2010 2011 2012 2013 2014 2015 2016 2017 2018

    2019 June 2014 WWDC application became the first publicly released Swift app
  19. @PreusslerBerlin 2010 2011 2012 2013 2014 2015 2016 2017 2018

    2019 September 2014 Swift 1.0
  20. @PreusslerBerlin 2010 2011 2012 2013 2014 2015 2016 2017 2018

    2019 Februar 2016 Kotlin 1.0
  21. @PreusslerBerlin 2010 2011 2012 2013 2014 2015 2016 2017 2018

    2019 Google I/O 2017 Official Kotlin support for Android
  22. @PreusslerBerlin 2010 2011 2012 2013 2014 2015 2016 2017 2018

    2019 September 2017 Java 9
  23. @PreusslerBerlin 2010 2011 2012 2013 2014 2015 2016 2017 2018

    2019 March 2018 Java 10
  24. @PreusslerBerlin 2010 2011 2012 2013 2014 2015 2016 2017 2018

    2019 Google I/O 2019 Kotlin becomes preferred language for Android
  25. @PreusslerBerlin Why Kotlin?

  26. @PreusslerBerlin Goals of Kotlin Modern language Faster compilation than Scala

    Smaller footprint than Scala Designed to work perfectly with Java (designed for 6+8)
  27. @PreusslerBerlin Why Kotlin? Null safe Functional aspects Strongly typed but

    type Inference Reduces boilerplate
  28. @PreusslerBerlin Kotlin is.. Strongly typed Dynamic typed Object orientated Functional

    kotlin java scala groovy clojure
  29. @PreusslerBerlin Makes developers happy Happiness

  30. @PreusslerBerlin Basics String someString; final String someConstantString;

  31. @PreusslerBerlin Basics

  32. @PreusslerBerlin Basics var someString: String val someConstantString: String

  33. @PreusslerBerlin The power of type inference Integer doSomething(String someString) {

    return someString.getLength(); }
  34. @PreusslerBerlin The power of type inference

  35. @PreusslerBerlin The power of type inference fun doSomething(someString: String): Int

    { return someString.length }
  36. @PreusslerBerlin The power of type inference fun doSomething(someString: String): Int

    = someString.length
  37. @PreusslerBerlin The power of type inference fun doSomething(someString: String) =

    someString.length
  38. @PreusslerBerlin Type inference in Java HashMap<String,Integer> x = new HashMap<String,Integer>();

  39. @PreusslerBerlin Type inference in Java HashMap<String,Integer> x = new HashMap();

  40. @PreusslerBerlin Type inference in Java 10 var x = new

    HashMap<String,Integer>();
  41. @PreusslerBerlin Type inference in Java 10 Difference to Kotlin: •

    var is not a keyword in Java 10 • it‘s a reserved type name
  42. @PreusslerBerlin Let’s talk about null

  43. @PreusslerBerlin Lets talk null I call it my billion-dollar mistake.

    It was the invention of the null reference in 1965 Tony Hoare ( inventor of the null reference)
  44. @PreusslerBerlin Lets talk null if (button != null){ button.onPressed(); }

  45. @PreusslerBerlin Lets talk null if (button.isPresent()){ button.get().onPressed(); }

  46. @PreusslerBerlin Lets talk null

  47. @PreusslerBerlin Lets talk null button?.onPressed()

  48. @PreusslerBerlin Lets talk null someString?.length

  49. @PreusslerBerlin Lets talk null someString?.length ?: 0

  50. @PreusslerBerlin Lets talk null someString!!.length

  51. @PreusslerBerlin Lets talk null val someString : String? …

  52. @PreusslerBerlin Lets talk null • Equivalent in Java: @NonNull but

    runtime crash vs compiler only • Nullability is Part of Typesystem
  53. @PreusslerBerlin Lets talk null fun some(thing: String?) {…} public final

    void some( @Nullable String thing) {…}
  54. @PreusslerBerlin Lets talk null fun some(thing: String) {…} public final

    void some( @NotNull String thing) { checkParameterIsNotNull(thing, "thing"); }
  55. @PreusslerBerlin Smart casts Object someString … if (someString instanceOf String)

    { ((String)someString).getLength(); }
  56. @PreusslerBerlin Smart casts

  57. @PreusslerBerlin Smart casts val someString : Any if (someString is

    String) { someString.length }
  58. @PreusslerBerlin Getter, setter view.setVisibility(View.GONE);

  59. @PreusslerBerlin Getter, setter

  60. @PreusslerBerlin Getter, setter view.visibility = View.GONE

  61. @PreusslerBerlin Lambdas • Came in Java-8 • Android devs had

    to rely on Retrolambda very long
  62. @PreusslerBerlin Lambdas list.forEach( element -> System.out.println(element) );

  63. @PreusslerBerlin Lambdas

  64. @PreusslerBerlin Lambdas list.forEach{ element -> System.out.println(element) }

  65. @PreusslerBerlin Lambdas list.forEach{ System.out.println(it) }

  66. @PreusslerBerlin Collections List<String> myList = Arrays.asList("1", "2", "3")

  67. @PreusslerBerlin Collections

  68. @PreusslerBerlin Collections val myList = listOf("1", "2", "3") val myList

    = mutablelistOf("1", "2", "3")
  69. @PreusslerBerlin Streams tags.stream() .map(tag -> tag.replace("#", "")) .collect(joining(",");

  70. @PreusslerBerlin Streams

  71. @PreusslerBerlin Streams tags.map{ it.replace("#", "") } .join(",")

  72. @PreusslerBerlin Streams tags.asSequence(). .map{ it.replace("#", "") } .join(",")

  73. @PreusslerBerlin default parameters vs overloading class Api { Api(String baseURl)

    { this(baseURl, CacheStrategy.NO_CACHE) } Api(String baseURl, CacheStrategy cache) { } }
  74. @PreusslerBerlin default parameters vs overloading

  75. @PreusslerBerlin default parameters vs overloading class Api( baseUrl: String, cache:

    CacheStrategy = CacheStrategy.NO_CACHE )
  76. @PreusslerBerlin default parameters vs overloading class Api( private val baseUrl:

    String, val cache: CacheStrategy = CacheStrategy.NO_CACHE )
  77. @PreusslerBerlin Data classes data class Team( val name: String? =

    null, val logo: String? = null )
  78. @PreusslerBerlin Sealed classes sealed class LoadingState { class Loading :

    LoadingState() class Loaded : LoadingState() class Empty : LoadingState() }
  79. @PreusslerBerlin Lazy initialization public class LazyField { private String value;

    public String getValue() { if (value == null) { value = computeValue(); } return value } private String computeValue() { .... } }
  80. @PreusslerBerlin Lazy initialization

  81. @PreusslerBerlin Lazy initialization class LazyField { val: String by lazy

    { computeValue() } private fun computeValue()= … }
  82. @PreusslerBerlin Lazy initialization • Framework class like Activities: no control

    over constructor • How use the compiler to check for null?
  83. @PreusslerBerlin Late initialization • Framework class like Activities: no control

    over constructor • How use the compiler to check for null?
  84. @PreusslerBerlin Late initialization View someView; ... someView = findViewbyId(R.id.myView);

  85. @PreusslerBerlin Late initialization

  86. @PreusslerBerlin Late initialization lateinit someView: View ... someView = findViewbyId(R.id.myView);

  87. @PreusslerBerlin Primitives in Kotlin

  88. @PreusslerBerlin Primitives in Kotlin • No primitives

  89. @PreusslerBerlin Primitives in Kotlin • No primitives int a; Integer

    b; a: Integer
  90. @PreusslerBerlin Primitives in Kotlin • No primitives • Boxing? Therefore

    no boxing issues (mostly) int a; Integer b; a: Integer
  91. @PreusslerBerlin Primitives in Kotlin: Costs? • The numeric type usages

    in Kotlin are compiled into JVM primitives where possible. • Compiler decides
  92. @PreusslerBerlin Primitives in Kotlin: Costs? • The numeric type usages

    in Kotlin are compiled into JVM primitives where possible. • Compiler decides • Works because of missing widening int a = 1; double b = a; val a:Int = 1 val b:Double = a
  93. @PreusslerBerlin Primitives in Kotlin • Nullable type cannot be primitive

    • Primitives cannot be used as a generic type argument. • List<Int> is equivalent of Java List<Integer> • Therefore IntArray as type!
  94. @PreusslerBerlin Operator overloading

  95. @PreusslerBerlin Operator overloading operator fun plusAssign(callback: Callback) { callbacks.add(callback) }

    operator fun minusAssign(callback: Callback) { callbacks.remove(callback) } adapterCallbacks += {…}
  96. @PreusslerBerlin Expression Translated to a++ a.inc() + see below a--

    a.dec() + see below Expression Translated to +a a.unaryPlus() -a a.unaryMinus() !a a.not() Expression Translated to a + b a.plus(b) a - b a.minus(b) a * b a.times(b) a / b a.div(b) a % b a.rem(b), a.mod(b) (deprecated) a..b a.rangeTo(b)
  97. @PreusslerBerlin Operator overloading Expression Translated to a > b a.compareTo(b)

    > 0 a < b a.compareTo(b) < 0 a >= b a.compareTo(b) >= 0 a <= b a.compareTo(b) <= 0 Expression Translated to a == b a?.equals(b) ?: (b === null) a != b !(a?.equals(b) ?: (b === null))
  98. @PreusslerBerlin Operator overloading Expression Translated to a in b b.contains(a)

    a !in b !b.contains(a) Expression Translated to a[i] a.get(i) a[i, j] a.get(i, j) a[i_1, ..., i_n] a.get(i_1, ..., i_n) a[i] = b a.set(i, b) a[i, j] = b a.set(i, j, b) a[i_1, ..., i_n] = b a.set(i_1, ..., i_n, b)
  99. @PreusslerBerlin Operator overloading Expression Translated to a() a.invoke() a(i) a.invoke(i)

    a(i, j) a.invoke(i, j) a(i_1, ..., i_n) a.invoke(i_1, ..., i_n) Expression Translated to a += b a.plusAssign(b) a -= b a.minusAssign(b) a *= b a.timesAssign(b) a /= b a.divAssign(b) a %= b a.remAssign(b), a.modAssign(b) (deprecated)
  100. @PreusslerBerlin Operator overloading • Range expression for (i in 1..4)

    print(i) operator fun rangeTo(other: Int) = IntRange(this, other)
  101. @PreusslerBerlin Operator overloading in RxKotlin disposables += clips.subscribeBy( onError =

    { logE(it) }, onNext = { onNewClip(it) } )
  102. @PreusslerBerlin Getter / Setter var live = true private set

  103. @PreusslerBerlin Getter / Setter val live get() = category.live val

    live = category.live
  104. @PreusslerBerlin Getter / Setter val live get() = category.live

  105. @PreusslerBerlin Getter / Setter val live get() = category.live public

    final boolean getLive() { return category.getLive(); }
  106. @PreusslerBerlin Delegated properties var something: Something by lazy{} var something:

    Something by inject{}
  107. @PreusslerBerlin Delegation • inheritance Effective Java: Item 16: Favor composition

    over inheritance class FirebaseFeatureFlags ( private val defaults: DefaultFeatureFlags ) : FeatureFlags by defaults {
  108. @PreusslerBerlin Singleton class Singleton { final static Singleton instance =

    new Singleton() private Singleton() {} }
  109. @PreusslerBerlin Singleton

  110. @PreusslerBerlin Singleton object Singleton

  111. @PreusslerBerlin Extension functions class Utils { public static boolean isNonNullOrEmpty(String

    string){ … } } isNonNullOrEmpty(“hallo“)
  112. @PreusslerBerlin Extension functions

  113. @PreusslerBerlin Extension functions fun String?.isNonNullOrEmpty() = {…} “hallo“.isNonNullOrEmpty()

  114. @PreusslerBerlin Extension functions fun String?.isNonNullOrEmpty() = {…} public static final

    boolean isNonNullOrEmpty( @Nullable String $receiver) {… }
  115. @PreusslerBerlin Standard functions val calendar = Calendar.getInstance(Locale.US).apply { set(Calendar.DAY_OF_MONTH, 3)

    set(Calendar.MONTH, Calendar.MARCH) set(Calendar.YEAR, 1990) }
  116. @PreusslerBerlin Standard functions

  117. @PreusslerBerlin inlining

  118. @PreusslerBerlin inline •Avoid runtime penalties of wrappers by inline”ing

  119. @PreusslerBerlin inline •Powerful with reified: Allows generics with type check:

    T::class inline fun <reified T : Context> Activity.start() { startActivity(Intent(this, T::class.java)) }
  120. inline inline fun <reified T : Context> Activity.start() { startActivity(Intent(this,

    T::class.java)) } start<MainActivity>() $receiver$iv.startActivity( new Intent( (Context)$receiver$iv, MainActivity.class) );
  121. @PreusslerBerlin inline • Inline classes • Experimental inline class Time(private

    val long timeMs)
  122. @PreusslerBerlin inline • Inline classes • Experimental • Inline classes

    are final • Can lead to weird boxing issues • Not compatible with @Parcelize inline class Time(private val long timeMs)
  123. @PreusslerBerlin Some changes

  124. @PreusslerBerlin In/out https://twitter.com/fmuntenescu/status/982268265853476867

  125. @PreusslerBerlin Static? class Job { static String ERROR = null

    }
  126. @PreusslerBerlin Static? class Job { companion object { var ERROR:

    String = null } }
  127. @PreusslerBerlin Other changes • Classes/methods public by default

  128. @PreusslerBerlin Other changes • Classes/methods public by default • Classes/methods

    final by default (vs open)
  129. @PreusslerBerlin Other changes • Classes/methods public by default • Classes/methods

    final by default (vs open) • Inner class: static by default (vs inner)
  130. @PreusslerBerlin Other changes • Classes/methods public by default • Classes/methods

    final by default (vs open) • Inner class: static by default (vs inner) • Stricter usage of protected
  131. @PreusslerBerlin Other changes • Classes/methods public by default • Classes/methods

    final by default (vs open) • Inner class: static by default (vs inner) • Stricter usage of protected • New visibility: internal
  132. @PreusslerBerlin Other changes • Classes/methods public by default • Classes/methods

    final by default (vs open) • Inner class: static by default (vs inner) • Stricter usage of protected • New visibility: internal • One file can have multiple public classes
  133. @PreusslerBerlin Other changes • Classes/methods public by default • Classes/methods

    final by default (vs open) • Inner class: static by default (vs inner) • Stricter usage of protected • New visibility: internal • One file can have multiple public classes • „global“ functions & variables are allowed
  134. @PreusslerBerlin Other changes • Classes/methods public by default • Classes/methods

    final by default (vs open) • Inner class: static by default (vs inner) • Stricter usage of protected • New visibility: internal • One file can have multiple public classes • „global“ functions & variables are allowed • No checked Exceptions
  135. @PreusslerBerlin Other changes • void -> Unit • Object ->

    Any
  136. @PreusslerBerlin Other changes • void -> Unit • Object ->

    Any • Plus Nothing
  137. @PreusslerBerlin Bad news something ? 1 : 0 something !=

    null ? something : "" L
  138. @PreusslerBerlin Bad news if (something ) 1 else 0 L

    something ?: ""
  139. @PreusslerBerlin Java Interop

  140. @PreusslerBerlin Java Interop public final class FileKt { public static

    final void foobar() {..} } //File.kt fun foobar(){..}
  141. @PreusslerBerlin Java Interop • @JvmOverloads • @JvmStatic • @JvmField •

    @JvmName • @Throws
  142. @PreusslerBerlin Java Interop • Careful with „sneaky“ Kotlin exceptions •

    @Throws
  143. @PreusslerBerlin Java Interop @Metadata( mv = {1, 1, 13}, bv

    = {1, 0, 3}, k = 1, d1 = {"\u0000\u0014\n\u0002\u0018\u0002\n\u0002\u0010 \u0000\n\u0002\b\u0002\n\u0002\u0010\u0002\n\u00 02\b\u0003\u0018\u00002\u00020\u0001:\u0001\u000 6B\u0005¢\u0006\u0002\u0010\u0002J\b\u0010\u0003 \u001a\u00020\u0004H\u0007J\u0006\u0010\u0005\u0 01a\u00020\u0004¨\u0006\u0007"}, d2 = {"Lde/jodamob/android/kotlin/T_TestingTest;", "", "()V", "test", "", "throwSomething", "Something", "app"} )
  144. @PreusslerBerlin Java Interop • Performance in most case same as

    Java https://de.slideshare.net/intelliyole/kotlin-bytecode-generation-and-runtime-performance
  145. @PreusslerBerlin Compile time

  146. @PreusslerBerlin

  147. @PreusslerBerlin Sum up

  148. @PreusslerBerlin Kotlin Less code

  149. @PreusslerBerlin Less Code Kotlin .. helps to increase a cut

    in the lines of code by approximately 40 % (JetBrains) … tests show … the number of code lines reduces by 30… https://belitsoft.com/apps-development-services/java-vs-kotlin
  150. @PreusslerBerlin Kotlin Less code No more null

  151. @PreusslerBerlin Kotlin Less code Easy to learn No more null

  152. @PreusslerBerlin Kotlin No revolution

  153. @PreusslerBerlin Kotlin No revolution Just evolution

  154. @PreusslerBerlin Kotlin No revolution (pragmatic) evolution

  155. @PreusslerBerlin Kotlin ‘Kotlin isn't revolutionary (with the possible exception of

    its null-handling) but feels like a very careful amalgamation of some of the best features of other languages. Rob Fletcher, Netflix https://belitsoft.com/apps-development-services/java-vs-kotlin
  156. @PreusslerBerlin Kotlin is … „Scala for Dummies” https://towardsdatascience.com/introduction-to-kotlin-statistics-cdad3be88b5

  157. @PreusslerBerlin Makes developers happy fun fun fun

  158. @PreusslerBerlin Get started

  159. Java vs Kotlin @PreusslerBerlin Thanks