Mikhail Glukhikh mailto: [email protected]...

45
Mikhail Glukhikh mailto: [email protected] JetBrains, Senior Software Developer

Transcript of Mikhail Glukhikh mailto: [email protected]...

Page 1: Mikhail Glukhikh mailto: Mikhail.Glukhikh@jetbrains.com ...public.jugru.org/jpointsd/2016/msk/day_1/track_2/gluhih.pdf · Java (1995) Groovy (2003) Scala (2004) Clojure (2007) Kotlin

Mikhail Glukhikhmailto: [email protected]

JetBrains, Senior Software Developer

Page 2: Mikhail Glukhikh mailto: Mikhail.Glukhikh@jetbrains.com ...public.jugru.org/jpointsd/2016/msk/day_1/track_2/gluhih.pdf · Java (1995) Groovy (2003) Scala (2004) Clojure (2007) Kotlin

Java (1995)

Groovy (2003)

Scala (2004)

Clojure (2007)

Kotlin (2016)

Fantom (2005), Ceylon (2013), Gosu (2014)

2

Page 3: Mikhail Glukhikh mailto: Mikhail.Glukhikh@jetbrains.com ...public.jugru.org/jpointsd/2016/msk/day_1/track_2/gluhih.pdf · Java (1995) Groovy (2003) Scala (2004) Clojure (2007) Kotlin

Более ясный и краткий язык, чем Java◦ Свойства

class Point(val x: Double, val y: Double)

3

Page 4: Mikhail Glukhikh mailto: Mikhail.Glukhikh@jetbrains.com ...public.jugru.org/jpointsd/2016/msk/day_1/track_2/gluhih.pdf · Java (1995) Groovy (2003) Scala (2004) Clojure (2007) Kotlin

public class Point {private final double x;private final double y;

public Point(double x, double y) {this.x = x;this.y = y;

}public double getX() {

return x;}public double getY() {

return y;}

}

4

Page 5: Mikhail Glukhikh mailto: Mikhail.Glukhikh@jetbrains.com ...public.jugru.org/jpointsd/2016/msk/day_1/track_2/gluhih.pdf · Java (1995) Groovy (2003) Scala (2004) Clojure (2007) Kotlin

Более ясный и краткий язык, чем Java◦ Функции-расширения

fun Array<*>.firstOrNull() = if (size >= 1) this[0] else null

5

Page 6: Mikhail Glukhikh mailto: Mikhail.Glukhikh@jetbrains.com ...public.jugru.org/jpointsd/2016/msk/day_1/track_2/gluhih.pdf · Java (1995) Groovy (2003) Scala (2004) Clojure (2007) Kotlin

Более ясный и краткий язык, чем Java◦ Функции-расширения

fun Array<*>.firstOrNull() = if (size >= 1) this[0] else null

◦ Вывод типов

val name /* : String */ = "Mikhail"

6

Page 7: Mikhail Glukhikh mailto: Mikhail.Glukhikh@jetbrains.com ...public.jugru.org/jpointsd/2016/msk/day_1/track_2/gluhih.pdf · Java (1995) Groovy (2003) Scala (2004) Clojure (2007) Kotlin

Более ясный и краткий язык, чем Java◦ Функции-расширения

fun Array<*>.firstOrNull() = if (size >= 1) this[0] else null

◦ Вывод типов

val name /* : String */ = "Mikhail"

◦ Строковые шаблоны

val greeting = "Hello, $name, I am glad to see you"

7

Page 8: Mikhail Glukhikh mailto: Mikhail.Glukhikh@jetbrains.com ...public.jugru.org/jpointsd/2016/msk/day_1/track_2/gluhih.pdf · Java (1995) Groovy (2003) Scala (2004) Clojure (2007) Kotlin

fun Array<*>.firstOrNull() = if (size >= 1) this[0] else null

fun main(args: Array<String>) {

// Elvis vv

val name = args.firstOrNull() ?: "Kotlin"

println("Hello, $name, I am glad to see you")

}

8

Page 9: Mikhail Glukhikh mailto: Mikhail.Glukhikh@jetbrains.com ...public.jugru.org/jpointsd/2016/msk/day_1/track_2/gluhih.pdf · Java (1995) Groovy (2003) Scala (2004) Clojure (2007) Kotlin

Elvis-операторfirst ?: second // is equivalent to

if (first != null) first else second

9

Page 10: Mikhail Glukhikh mailto: Mikhail.Glukhikh@jetbrains.com ...public.jugru.org/jpointsd/2016/msk/day_1/track_2/gluhih.pdf · Java (1995) Groovy (2003) Scala (2004) Clojure (2007) Kotlin

public class Main {public static void main(String[] args) {

String name = args.length > 0 ?

args[0] : "Java";System.out.println("Hello, " + name +

", I am glad to see you");}

}

10

Page 11: Mikhail Glukhikh mailto: Mikhail.Glukhikh@jetbrains.com ...public.jugru.org/jpointsd/2016/msk/day_1/track_2/gluhih.pdf · Java (1995) Groovy (2003) Scala (2004) Clojure (2007) Kotlin

Более безопасный язык, чем Java◦ Защита от NullPointerException

11

Page 12: Mikhail Glukhikh mailto: Mikhail.Glukhikh@jetbrains.com ...public.jugru.org/jpointsd/2016/msk/day_1/track_2/gluhih.pdf · Java (1995) Groovy (2003) Scala (2004) Clojure (2007) Kotlin

fun caller(x: Type? /* ? means "can be null" */) {x.foo() // Error: x can be null

}

12

Page 13: Mikhail Glukhikh mailto: Mikhail.Glukhikh@jetbrains.com ...public.jugru.org/jpointsd/2016/msk/day_1/track_2/gluhih.pdf · Java (1995) Groovy (2003) Scala (2004) Clojure (2007) Kotlin

fun caller(x: Type? /* ? means "can be null" */) {x.foo() // Error: x can be nullx?.foo() // OK, safe call

}

13

Page 14: Mikhail Glukhikh mailto: Mikhail.Glukhikh@jetbrains.com ...public.jugru.org/jpointsd/2016/msk/day_1/track_2/gluhih.pdf · Java (1995) Groovy (2003) Scala (2004) Clojure (2007) Kotlin

fun caller(x: Type? /* ? means "can be null" */) {x.foo() // Error: x can be nullx?.foo() // OK, safe call

x?.foo() ?: doIfNull() // OK: safe call + Elvis

}

14

Page 15: Mikhail Glukhikh mailto: Mikhail.Glukhikh@jetbrains.com ...public.jugru.org/jpointsd/2016/msk/day_1/track_2/gluhih.pdf · Java (1995) Groovy (2003) Scala (2004) Clojure (2007) Kotlin

fun caller(x: Type? /* ? means "can be null" */) {x.foo() // Error: x can be nullx?.foo() // OK, safe call

x?.foo() ?: doIfNull() // OK: safe call + Elvis

if (x != null) {

x.foo() // OK, smart cast

}

}

15

Page 16: Mikhail Glukhikh mailto: Mikhail.Glukhikh@jetbrains.com ...public.jugru.org/jpointsd/2016/msk/day_1/track_2/gluhih.pdf · Java (1995) Groovy (2003) Scala (2004) Clojure (2007) Kotlin

fun caller(x: Type? /* ? means "can be null" */) {x.foo() // Error: x can be nullx?.foo() // OK, safe call

x?.foo() ?: doIfNull() // OK: safe call + Elvis

if (x != null) {

x.foo() // OK, smart cast

}

x!!.foo() // OK, but KNPE is possible}

16

Page 17: Mikhail Glukhikh mailto: Mikhail.Glukhikh@jetbrains.com ...public.jugru.org/jpointsd/2016/msk/day_1/track_2/gluhih.pdf · Java (1995) Groovy (2003) Scala (2004) Clojure (2007) Kotlin

Более безопасный язык, чем Java◦ Защита от NullPointerException

◦ Защита от ClassCastException

17

Page 18: Mikhail Glukhikh mailto: Mikhail.Glukhikh@jetbrains.com ...public.jugru.org/jpointsd/2016/msk/day_1/track_2/gluhih.pdf · Java (1995) Groovy (2003) Scala (2004) Clojure (2007) Kotlin

interface Base

class Derived : Base {

fun fromDerived() {}

}

fun caller1(x: Base) {

(x as Derived).fromDerived() // OK, CCE possible

}

18

Page 19: Mikhail Glukhikh mailto: Mikhail.Glukhikh@jetbrains.com ...public.jugru.org/jpointsd/2016/msk/day_1/track_2/gluhih.pdf · Java (1995) Groovy (2003) Scala (2004) Clojure (2007) Kotlin

interface Base

class Derived : Base {

fun fromDerived() {}

}

fun caller2(x: Base) {

(x as? Derived).fromDerived() // Error

}

19

Page 20: Mikhail Glukhikh mailto: Mikhail.Glukhikh@jetbrains.com ...public.jugru.org/jpointsd/2016/msk/day_1/track_2/gluhih.pdf · Java (1995) Groovy (2003) Scala (2004) Clojure (2007) Kotlin

interface Base

class Derived : Base {

fun fromDerived() {}

}

fun caller2(x: Base) {

(x as? Derived).fromDerived() // Error

(x as? Derived)?.fromDerived() // OK, safe call

}

20

Page 21: Mikhail Glukhikh mailto: Mikhail.Glukhikh@jetbrains.com ...public.jugru.org/jpointsd/2016/msk/day_1/track_2/gluhih.pdf · Java (1995) Groovy (2003) Scala (2004) Clojure (2007) Kotlin

interface Base

class Derived : Base {

fun fromDerived() {}

}

fun caller2(x: Base) {

(x as? Derived).fromDerived() // Error

(x as? Derived)?.fromDerived() // OK, safe call

if (x is Derived) {

x.fromDerived() // OK, smart cast

}

}

21

Page 22: Mikhail Glukhikh mailto: Mikhail.Glukhikh@jetbrains.com ...public.jugru.org/jpointsd/2016/msk/day_1/track_2/gluhih.pdf · Java (1995) Groovy (2003) Scala (2004) Clojure (2007) Kotlin

Более безопасный язык, чем Java◦ Защита от NullPointerException

◦ Защита от ClassCastException

◦ Защита от ArrayStoreException

22

Page 23: Mikhail Glukhikh mailto: Mikhail.Glukhikh@jetbrains.com ...public.jugru.org/jpointsd/2016/msk/day_1/track_2/gluhih.pdf · Java (1995) Groovy (2003) Scala (2004) Clojure (2007) Kotlin

fun foo(arr: Array<String>) {

val anyArr: Array<Any> = arr // ???

}

23

Page 24: Mikhail Glukhikh mailto: Mikhail.Glukhikh@jetbrains.com ...public.jugru.org/jpointsd/2016/msk/day_1/track_2/gluhih.pdf · Java (1995) Groovy (2003) Scala (2004) Clojure (2007) Kotlin

fun foo(arr: Array<String>) {

// Error! Arrays are invariant in Kotlin

val anyArr: Array<Any> = arr

}

24

Page 25: Mikhail Glukhikh mailto: Mikhail.Glukhikh@jetbrains.com ...public.jugru.org/jpointsd/2016/msk/day_1/track_2/gluhih.pdf · Java (1995) Groovy (2003) Scala (2004) Clojure (2007) Kotlin

fun foo(arr: Array<String>) {

// Error! Arrays are invariant in Kotlin

val anyArr: Array<Any> = arr

anyArr[0] = 42 // ASE in Java

}

25

Page 26: Mikhail Glukhikh mailto: Mikhail.Glukhikh@jetbrains.com ...public.jugru.org/jpointsd/2016/msk/day_1/track_2/gluhih.pdf · Java (1995) Groovy (2003) Scala (2004) Clojure (2007) Kotlin

fun foo(list: List<String>) {

// OK! Lists are covariant in Kotlin

val anyList: List<Any> = list

anyList[0] = 42 // Error! List is read-only

}

26

Page 27: Mikhail Glukhikh mailto: Mikhail.Glukhikh@jetbrains.com ...public.jugru.org/jpointsd/2016/msk/day_1/track_2/gluhih.pdf · Java (1995) Groovy (2003) Scala (2004) Clojure (2007) Kotlin

fun foo(list: List<String>) {

// OK! Lists are covariant in Kotlin

val anyList: List<Any> = list

anyList[0] = 42 // Error! List is read-only

}

interface List<out T> : ... { ... }

27

Page 28: Mikhail Glukhikh mailto: Mikhail.Glukhikh@jetbrains.com ...public.jugru.org/jpointsd/2016/msk/day_1/track_2/gluhih.pdf · Java (1995) Groovy (2003) Scala (2004) Clojure (2007) Kotlin

fun foo(list: List<String>) {

// OK! Lists are covariant in Kotlin

val anyList: List<Any> = list

anyList[0] = 42 // Error! List is read-only

}

interface List<out T> : ... { ... }

// Contravariant

interface Comparable<in T> : ... { ... }

28

Page 29: Mikhail Glukhikh mailto: Mikhail.Glukhikh@jetbrains.com ...public.jugru.org/jpointsd/2016/msk/day_1/track_2/gluhih.pdf · Java (1995) Groovy (2003) Scala (2004) Clojure (2007) Kotlin

Класс Line, использующий класс Point◦ class Point(val x: Double, val y: Double)

Builder для создания линии по двум точкам

29

Page 30: Mikhail Glukhikh mailto: Mikhail.Glukhikh@jetbrains.com ...public.jugru.org/jpointsd/2016/msk/day_1/track_2/gluhih.pdf · Java (1995) Groovy (2003) Scala (2004) Clojure (2007) Kotlin

class Point(val x: Double, val y: Double)// Java: ax + by = 1public class Line {

private final double a;private final double b;public Line(double a, double b) {

this.a = a; this.b = b;}static public Line create(Point p1, Point p2) {

double d = p1.getX() * p2.getY() –p1.getY() * p2.getX();

double da = p2.getY() - p1.getY();double db = p1.getX() - p2.getX();return new Line(da / d, db / d);

}}

30

Page 31: Mikhail Glukhikh mailto: Mikhail.Glukhikh@jetbrains.com ...public.jugru.org/jpointsd/2016/msk/day_1/track_2/gluhih.pdf · Java (1995) Groovy (2003) Scala (2004) Clojure (2007) Kotlin

class Point(val x: Double, val y: Double)// Kotlin: ax + by = 1class Line (val a: Double, val b: Double)

fun createLine(p1: Point, p2: Point): Line {

val d = p1.x * p2.y - p1.y * p2.xval da = p2.y - p1.yval db = p1.x - p2.xreturn Line(da / d, db / d)

}

31

Page 32: Mikhail Glukhikh mailto: Mikhail.Glukhikh@jetbrains.com ...public.jugru.org/jpointsd/2016/msk/day_1/track_2/gluhih.pdf · Java (1995) Groovy (2003) Scala (2004) Clojure (2007) Kotlin

Пример: бинарное дерево

Узел дерева хранит ключ / значение + ◦ или лист

◦ или поддерево

32

Page 33: Mikhail Glukhikh mailto: Mikhail.Glukhikh@jetbrains.com ...public.jugru.org/jpointsd/2016/msk/day_1/track_2/gluhih.pdf · Java (1995) Groovy (2003) Scala (2004) Clojure (2007) Kotlin

sealed class Element<Key, out Value>(

val key: Key, val value: Value) {

}

33

Page 34: Mikhail Glukhikh mailto: Mikhail.Glukhikh@jetbrains.com ...public.jugru.org/jpointsd/2016/msk/day_1/track_2/gluhih.pdf · Java (1995) Groovy (2003) Scala (2004) Clojure (2007) Kotlin

sealed class Element<Key, out Value>(

val key: Key, val value: Value) {

class Leaf<Key, out Value>(

key: Key, value: Value) : Element<Key, Value>(key, value)

}

34

Page 35: Mikhail Glukhikh mailto: Mikhail.Glukhikh@jetbrains.com ...public.jugru.org/jpointsd/2016/msk/day_1/track_2/gluhih.pdf · Java (1995) Groovy (2003) Scala (2004) Clojure (2007) Kotlin

sealed class Element<Key, out Value>(

val key: Key, val value: Value) {

class Leaf<Key, out Value>(

key: Key, value: Value) : Element<Key, Value>(key, value)

class Tree<Key, out Value>(

key: Key, value: Value,

val left: Element<Key, Value>,

val right: Element<Key, Value>? = null

) : Element<Key, Value>(key, value)

}

35

Page 36: Mikhail Glukhikh mailto: Mikhail.Glukhikh@jetbrains.com ...public.jugru.org/jpointsd/2016/msk/day_1/track_2/gluhih.pdf · Java (1995) Groovy (2003) Scala (2004) Clojure (2007) Kotlin

fun <K, V> Element<K, V>.search(

key: K): V? =

if (this.key == key) value

// Exhaustive when

else when (this) {

is Element.Leaf -> null

is Element.Tree -> left.search(key) ?:

right?.search(key)

}

36

Page 37: Mikhail Glukhikh mailto: Mikhail.Glukhikh@jetbrains.com ...public.jugru.org/jpointsd/2016/msk/day_1/track_2/gluhih.pdf · Java (1995) Groovy (2003) Scala (2004) Clojure (2007) Kotlin

fun <K : Comparable<K>, V> Element<K, V>.search(

key: K): V? =

if (this.key == key) value

// Exhaustive when

else when (this) {

is Element.Leaf -> null

is Element.Tree -> if (key < this.key)

left.search(key)

else right?.search(key)

}

37

Page 38: Mikhail Glukhikh mailto: Mikhail.Glukhikh@jetbrains.com ...public.jugru.org/jpointsd/2016/msk/day_1/track_2/gluhih.pdf · Java (1995) Groovy (2003) Scala (2004) Clojure (2007) Kotlin

Вычислить выражение в обратной польской записи

"3 10 5 + *" 3 * (10 + 5)// обратная польская запись инфиксная запись

38

Page 39: Mikhail Glukhikh mailto: Mikhail.Glukhikh@jetbrains.com ...public.jugru.org/jpointsd/2016/msk/day_1/track_2/gluhih.pdf · Java (1995) Groovy (2003) Scala (2004) Clojure (2007) Kotlin

private val operationMap =

mapOf<String, (Double, Double) -> Double>(

"+" to { x, y -> x + y }, "-" to { x, y -> y - x },

"*" to { x, y -> x * y }, "/" to { x, y -> y / x })

39

Page 40: Mikhail Glukhikh mailto: Mikhail.Glukhikh@jetbrains.com ...public.jugru.org/jpointsd/2016/msk/day_1/track_2/gluhih.pdf · Java (1995) Groovy (2003) Scala (2004) Clojure (2007) Kotlin

private val operationMap =

mapOf<String, (Double, Double) -> Double>(

"+" to { x, y -> x + y }, "-" to { x, y -> y - x },

"*" to { x, y -> x * y }, "/" to { x, y -> y / x })

fun polishCalculate(expr: String): Double {

val stack = Stack<Double>()

for (arg in expr.split(" ")) {

val op = operationMap[arg]

if (op != null) stack.execute(op)

else stack.push(arg.toDouble())}

return stack.pop()

}

40

Page 41: Mikhail Glukhikh mailto: Mikhail.Glukhikh@jetbrains.com ...public.jugru.org/jpointsd/2016/msk/day_1/track_2/gluhih.pdf · Java (1995) Groovy (2003) Scala (2004) Clojure (2007) Kotlin

private val operationMap =

mapOf<String, (Double, Double) -> Double>(

"+" to { x, y -> x + y }, "-" to { x, y -> y - x },

"*" to { x, y -> x * y }, "/" to { x, y -> y / x })

fun Stack<Double>.execute(op: (Double, Double) -> Double) =

push( op(pop(), pop()) )

fun polishCalculate(expr: String): Double {

val stack = Stack<Double>()

for (arg in expr.split(" ")) {

val op = operationMap[arg]

if (op != null) stack.execute(op)

else stack.push(arg.toDouble())}

return stack.pop()

}

41

Page 42: Mikhail Glukhikh mailto: Mikhail.Glukhikh@jetbrains.com ...public.jugru.org/jpointsd/2016/msk/day_1/track_2/gluhih.pdf · Java (1995) Groovy (2003) Scala (2004) Clojure (2007) Kotlin

https://github.com/mglukhikh/JavaToKotlin

Содержит рассмотренные выше примеры:◦ _1_hello: Hello, $Language!

◦ _2_exceptions: Исключения

◦ _3_geometry: Точка + Линия

◦ _4_tree: Бинарное дерево

◦ _5_polish: Калькулятор обратной польской записи

◦ ...

42

Page 43: Mikhail Glukhikh mailto: Mikhail.Glukhikh@jetbrains.com ...public.jugru.org/jpointsd/2016/msk/day_1/track_2/gluhih.pdf · Java (1995) Groovy (2003) Scala (2004) Clojure (2007) Kotlin

1.0: 15 февраля 2016◦ Обратная совместимость

Open-Source: http://github.com/JetBrains/Kotlin

Компиляция в JVM / Android / JS

Плагины для Intellij IDEA (встроенный) и для Eclipse

43

Page 44: Mikhail Glukhikh mailto: Mikhail.Glukhikh@jetbrains.com ...public.jugru.org/jpointsd/2016/msk/day_1/track_2/gluhih.pdf · Java (1995) Groovy (2003) Scala (2004) Clojure (2007) Kotlin

Около 25 разработчиков в проекте Kotlin

Около 50 компаний, более десяти тысяч активных программистов на Kotlin

Около 3 миллионов строк кода в открытых проектах на GitHub◦ Из них >80% в сторонних проектах

Около 1500 участников в Kotlin Slack

2 книги◦ Antonio Leiva. Kotlin for Android Developers

◦ Dmitry Jemerov, Svetlana Isakova. Kotlin in Action

44

Page 45: Mikhail Glukhikh mailto: Mikhail.Glukhikh@jetbrains.com ...public.jugru.org/jpointsd/2016/msk/day_1/track_2/gluhih.pdf · Java (1995) Groovy (2003) Scala (2004) Clojure (2007) Kotlin

http://kotlinlang.org – сайт языка https://kotlinlang.org/docs/reference/ -

документация http://github.com/JetBrains/Kotlin –

репозиторий проекта на GitHub http://blog.jetbrains.com/kotlin/ –

блог языка http://kotlin.link/ - Kotlin-ресурсы https://kotlinlang.slack.com/ - Kotlin Slack

Вопросы?

45