Slide 1

Slide 1 text

Java vs Kotlin Danny Preussler, JNation

Slide 2

Slide 2 text

@PreusslerBerlin about:me • Java developer since 2003 • Kotlin developer since 2016 • Google Developer Expert for Android and Kotlin • Introduced Kotlin at Groupon and Viacom

Slide 3

Slide 3 text

@PreusslerBerlin sporttotal.tv • We are streaming under- medialised sports • Amateur and semi professional football • Professional Volleyball…

Slide 4

Slide 4 text

@PreusslerBerlin

Slide 5

Slide 5 text

@PreusslerBerlin

Slide 6

Slide 6 text

@PreusslerBerlin Kotlin adoption • Languages developers want to learn in 2019 • https://research.hackerrank.co m/developer-skills/2019

Slide 7

Slide 7 text

@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/

Slide 8

Slide 8 text

@PreusslerBerlin Kotlin adoption Stackoverflow trends of JVM languages. #kotlin is first with a strong growth during the last 2 years.

Slide 9

Slide 9 text

@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/

Slide 10

Slide 10 text

@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/

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

@PreusslerBerlin 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 Google I/O 2019 Kotlin becomes preferred language for Android

Slide 25

Slide 25 text

@PreusslerBerlin Why Kotlin?

Slide 26

Slide 26 text

@PreusslerBerlin Goals of Kotlin Modern language Faster compilation than Scala Smaller footprint than Scala Designed to work perfectly with Java (designed for 6+8)

Slide 27

Slide 27 text

@PreusslerBerlin Why Kotlin? Null safe Functional aspects Strongly typed but type Inference Reduces boilerplate

Slide 28

Slide 28 text

@PreusslerBerlin Kotlin is.. Strongly typed Dynamic typed Object orientated Functional kotlin java scala groovy clojure

Slide 29

Slide 29 text

@PreusslerBerlin Makes developers happy Happiness

Slide 30

Slide 30 text

@PreusslerBerlin Basics String someString; final String someConstantString;

Slide 31

Slide 31 text

@PreusslerBerlin Basics

Slide 32

Slide 32 text

@PreusslerBerlin Basics var someString: String val someConstantString: String

Slide 33

Slide 33 text

@PreusslerBerlin The power of type inference Integer doSomething(String someString) { return someString.getLength(); }

Slide 34

Slide 34 text

@PreusslerBerlin The power of type inference

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

@PreusslerBerlin Type inference in Java HashMap x = new HashMap();

Slide 39

Slide 39 text

@PreusslerBerlin Type inference in Java HashMap x = new HashMap();

Slide 40

Slide 40 text

@PreusslerBerlin Type inference in Java 10 var x = new HashMap();

Slide 41

Slide 41 text

@PreusslerBerlin Type inference in Java 10 Difference to Kotlin: • var is not a keyword in Java 10 • it‘s a reserved type name

Slide 42

Slide 42 text

@PreusslerBerlin Let’s talk about null

Slide 43

Slide 43 text

@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)

Slide 44

Slide 44 text

@PreusslerBerlin Lets talk null if (button != null){ button.onPressed(); }

Slide 45

Slide 45 text

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

Slide 46

Slide 46 text

@PreusslerBerlin Lets talk null

Slide 47

Slide 47 text

@PreusslerBerlin Lets talk null button?.onPressed()

Slide 48

Slide 48 text

@PreusslerBerlin Lets talk null someString?.length

Slide 49

Slide 49 text

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

Slide 50

Slide 50 text

@PreusslerBerlin Lets talk null someString!!.length

Slide 51

Slide 51 text

@PreusslerBerlin Lets talk null val someString : String? …

Slide 52

Slide 52 text

@PreusslerBerlin Lets talk null • Equivalent in Java: @NonNull but runtime crash vs compiler only • Nullability is Part of Typesystem

Slide 53

Slide 53 text

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

Slide 54

Slide 54 text

@PreusslerBerlin Lets talk null fun some(thing: String) {…} public final void some( @NotNull String thing) { checkParameterIsNotNull(thing, "thing"); }

Slide 55

Slide 55 text

@PreusslerBerlin Smart casts Object someString … if (someString instanceOf String) { ((String)someString).getLength(); }

Slide 56

Slide 56 text

@PreusslerBerlin Smart casts

Slide 57

Slide 57 text

@PreusslerBerlin Smart casts val someString : Any if (someString is String) { someString.length }

Slide 58

Slide 58 text

@PreusslerBerlin Getter, setter view.setVisibility(View.GONE);

Slide 59

Slide 59 text

@PreusslerBerlin Getter, setter

Slide 60

Slide 60 text

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

Slide 61

Slide 61 text

@PreusslerBerlin Lambdas • Came in Java-8 • Android devs had to rely on Retrolambda very long

Slide 62

Slide 62 text

@PreusslerBerlin Lambdas list.forEach( element -> System.out.println(element) );

Slide 63

Slide 63 text

@PreusslerBerlin Lambdas

Slide 64

Slide 64 text

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

Slide 65

Slide 65 text

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

Slide 66

Slide 66 text

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

Slide 67

Slide 67 text

@PreusslerBerlin Collections

Slide 68

Slide 68 text

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

Slide 69

Slide 69 text

@PreusslerBerlin Streams tags.stream() .map(tag -> tag.replace("#", "")) .collect(joining(",");

Slide 70

Slide 70 text

@PreusslerBerlin Streams

Slide 71

Slide 71 text

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

Slide 72

Slide 72 text

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

Slide 73

Slide 73 text

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

Slide 74

Slide 74 text

@PreusslerBerlin default parameters vs overloading

Slide 75

Slide 75 text

@PreusslerBerlin default parameters vs overloading class Api( baseUrl: String, cache: CacheStrategy = CacheStrategy.NO_CACHE )

Slide 76

Slide 76 text

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

Slide 77

Slide 77 text

@PreusslerBerlin Data classes data class Team( val name: String? = null, val logo: String? = null )

Slide 78

Slide 78 text

@PreusslerBerlin Sealed classes sealed class LoadingState { class Loading : LoadingState() class Loaded : LoadingState() class Empty : LoadingState() }

Slide 79

Slide 79 text

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

Slide 80

Slide 80 text

@PreusslerBerlin Lazy initialization

Slide 81

Slide 81 text

@PreusslerBerlin Lazy initialization class LazyField { val: String by lazy { computeValue() } private fun computeValue()= … }

Slide 82

Slide 82 text

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

Slide 83

Slide 83 text

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

Slide 84

Slide 84 text

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

Slide 85

Slide 85 text

@PreusslerBerlin Late initialization

Slide 86

Slide 86 text

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

Slide 87

Slide 87 text

@PreusslerBerlin Primitives in Kotlin

Slide 88

Slide 88 text

@PreusslerBerlin Primitives in Kotlin • No primitives

Slide 89

Slide 89 text

@PreusslerBerlin Primitives in Kotlin • No primitives int a; Integer b; a: Integer

Slide 90

Slide 90 text

@PreusslerBerlin Primitives in Kotlin • No primitives • Boxing? Therefore no boxing issues (mostly) int a; Integer b; a: Integer

Slide 91

Slide 91 text

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

Slide 92

Slide 92 text

@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

Slide 93

Slide 93 text

@PreusslerBerlin Primitives in Kotlin • Nullable type cannot be primitive • Primitives cannot be used as a generic type argument. • List is equivalent of Java List • Therefore IntArray as type!

Slide 94

Slide 94 text

@PreusslerBerlin Operator overloading

Slide 95

Slide 95 text

@PreusslerBerlin Operator overloading operator fun plusAssign(callback: Callback) { callbacks.add(callback) } operator fun minusAssign(callback: Callback) { callbacks.remove(callback) } adapterCallbacks += {…}

Slide 96

Slide 96 text

@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)

Slide 97

Slide 97 text

@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))

Slide 98

Slide 98 text

@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)

Slide 99

Slide 99 text

@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)

Slide 100

Slide 100 text

@PreusslerBerlin Operator overloading • Range expression for (i in 1..4) print(i) operator fun rangeTo(other: Int) = IntRange(this, other)

Slide 101

Slide 101 text

@PreusslerBerlin Operator overloading in RxKotlin disposables += clips.subscribeBy( onError = { logE(it) }, onNext = { onNewClip(it) } )

Slide 102

Slide 102 text

@PreusslerBerlin Getter / Setter var live = true private set

Slide 103

Slide 103 text

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

Slide 104

Slide 104 text

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

Slide 105

Slide 105 text

@PreusslerBerlin Getter / Setter val live get() = category.live public final boolean getLive() { return category.getLive(); }

Slide 106

Slide 106 text

@PreusslerBerlin Delegated properties var something: Something by lazy{} var something: Something by inject{}

Slide 107

Slide 107 text

@PreusslerBerlin Delegation • inheritance Effective Java: Item 16: Favor composition over inheritance class FirebaseFeatureFlags ( private val defaults: DefaultFeatureFlags ) : FeatureFlags by defaults {

Slide 108

Slide 108 text

@PreusslerBerlin Singleton class Singleton { final static Singleton instance = new Singleton() private Singleton() {} }

Slide 109

Slide 109 text

@PreusslerBerlin Singleton

Slide 110

Slide 110 text

@PreusslerBerlin Singleton object Singleton

Slide 111

Slide 111 text

@PreusslerBerlin Extension functions class Utils { public static boolean isNonNullOrEmpty(String string){ … } } isNonNullOrEmpty(“hallo“)

Slide 112

Slide 112 text

@PreusslerBerlin Extension functions

Slide 113

Slide 113 text

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

Slide 114

Slide 114 text

@PreusslerBerlin Extension functions fun String?.isNonNullOrEmpty() = {…} public static final boolean isNonNullOrEmpty( @Nullable String $receiver) {… }

Slide 115

Slide 115 text

@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) }

Slide 116

Slide 116 text

@PreusslerBerlin Standard functions

Slide 117

Slide 117 text

@PreusslerBerlin inlining

Slide 118

Slide 118 text

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

Slide 119

Slide 119 text

@PreusslerBerlin inline •Powerful with reified: Allows generics with type check: T::class inline fun Activity.start() { startActivity(Intent(this, T::class.java)) }

Slide 120

Slide 120 text

inline inline fun Activity.start() { startActivity(Intent(this, T::class.java)) } start() $receiver$iv.startActivity( new Intent( (Context)$receiver$iv, MainActivity.class) );

Slide 121

Slide 121 text

@PreusslerBerlin inline • Inline classes • Experimental inline class Time(private val long timeMs)

Slide 122

Slide 122 text

@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)

Slide 123

Slide 123 text

@PreusslerBerlin Some changes

Slide 124

Slide 124 text

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

Slide 125

Slide 125 text

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

Slide 126

Slide 126 text

@PreusslerBerlin Static? class Job { companion object { var ERROR: String = null } }

Slide 127

Slide 127 text

@PreusslerBerlin Other changes • Classes/methods public by default

Slide 128

Slide 128 text

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

Slide 129

Slide 129 text

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

Slide 130

Slide 130 text

@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

Slide 131

Slide 131 text

@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

Slide 132

Slide 132 text

@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

Slide 133

Slide 133 text

@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

Slide 134

Slide 134 text

@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

Slide 135

Slide 135 text

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

Slide 136

Slide 136 text

@PreusslerBerlin Other changes • void -> Unit • Object -> Any • Plus Nothing

Slide 137

Slide 137 text

@PreusslerBerlin Bad news something ? 1 : 0 something != null ? something : "" L

Slide 138

Slide 138 text

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

Slide 139

Slide 139 text

@PreusslerBerlin Java Interop

Slide 140

Slide 140 text

@PreusslerBerlin Java Interop public final class FileKt { public static final void foobar() {..} } //File.kt fun foobar(){..}

Slide 141

Slide 141 text

@PreusslerBerlin Java Interop • @JvmOverloads • @JvmStatic • @JvmField • @JvmName • @Throws

Slide 142

Slide 142 text

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

Slide 143

Slide 143 text

@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"} )

Slide 144

Slide 144 text

@PreusslerBerlin Java Interop • Performance in most case same as Java https://de.slideshare.net/intelliyole/kotlin-bytecode-generation-and-runtime-performance

Slide 145

Slide 145 text

@PreusslerBerlin Compile time

Slide 146

Slide 146 text

@PreusslerBerlin

Slide 147

Slide 147 text

@PreusslerBerlin Sum up

Slide 148

Slide 148 text

@PreusslerBerlin Kotlin Less code

Slide 149

Slide 149 text

@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

Slide 150

Slide 150 text

@PreusslerBerlin Kotlin Less code No more null

Slide 151

Slide 151 text

@PreusslerBerlin Kotlin Less code Easy to learn No more null

Slide 152

Slide 152 text

@PreusslerBerlin Kotlin No revolution

Slide 153

Slide 153 text

@PreusslerBerlin Kotlin No revolution Just evolution

Slide 154

Slide 154 text

@PreusslerBerlin Kotlin No revolution (pragmatic) evolution

Slide 155

Slide 155 text

@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

Slide 156

Slide 156 text

@PreusslerBerlin Kotlin is … „Scala for Dummies” https://towardsdatascience.com/introduction-to-kotlin-statistics-cdad3be88b5

Slide 157

Slide 157 text

@PreusslerBerlin Makes developers happy fun fun fun

Slide 158

Slide 158 text

@PreusslerBerlin Get started

Slide 159

Slide 159 text

Java vs Kotlin @PreusslerBerlin Thanks