SlideShare a Scribd company logo
Kotlin для Android
Зачем нужен Kotlin для
Android?
• Ограничения языка Java и его проблемы
• Нельзя добавить методы для типов,
определенных платформой либо сторонней
библиотекой (ад из “*Util” классов)
• Проблемы с null
• Отсутсвие немодифицируемых коллекций
Зачем нужен Kotlin для
Android?
• Android поддерживает только Java 6
• Нет Java 8 Date API
• Нет Stream API для коллекций
• Нет лямбда выражений, ссылок на методы,
замыканий
• Try-with-resource (только для Android 4.4+)
• Проверка на null повсюду
Зачем нужен Kotlin для
Android?
• Проблемы дизайна Android API
• Сложная иерархия
• NPE повсюду
• Сложное в использование API
Variables
val sample: String = "Sample String"
Variables
val sample: String = "Sample String”

val sample = "Sample String”
val sample: List<String> = ArrayList()
Variables
val sample: String = null
COMPILE ERROR
Variables
val sample: String? = null
sample?.trim()
sample!!.trim()
Lazy Variables
class SampleFragment : Fragment() {
val margin: Int by lazy
{ resources.getDimensionPixelSize(R.dimen.std_margin) }
}
String Templates
val student = Student(1, "Ivan Ivanov", Date())

println("Student '${student.name}' is on ${student.course} course.")
Functions
fun sum(a: Int, b: Int): Int {

return a + b

}
Single-Expression Functions
fun sum(a: Int, b: Int): Int = a + b
Single-Expression Functions
fun sum(a: Int, b: Int) = a + b
Extension Functions
public final class CalendarUtils {



public static boolean isMonday(Calendar calendar) {

return calendar.get(Calendar.DAY_OF_WEEK) ==
Calendar.MONDAY;

}

}
Calendar calendar = Calendar.getInstance();

boolean isMonday = CalendarUtils.isMonday(calendar);
Extension Functions
fun Calendar.isMonday(): Boolean {

return get(Calendar.DAY_OF_WEEK) == Calendar.MONDAY

}
val calendar = Calendar.getInstance()
val isMonday = calendar.isMonday()
Extension Functions
fun Calendar.isMonday() =
get(Calendar.DAY_OF_WEEK) == Calendar.MONDAY
val calendar = Calendar.getInstance()
val isMonday = calendar.isMonday()
Extension Functions
fun View.setPaddingTop(padding: Int) {

setPadding(paddingLeft,
padding,
paddingRight,
paddingBottom)

}
Extension Functions
String name = null;

int nameColumnIndex =

cursor.getColumnIndexOrThrow("nameColumn");

if (!cursor.isNull(nameColumnIndex)) {

name = cursor.getString(nameColumnIndex);

}
fun Cursor.getStringOrNull(columnName: String): String? {

val nameColumnIndex = getColumnIndexOrThrow(columnName)

return if (isNull(nameColumnIndex)) null else getString(nameColumnIndex)

}



fun Cursor.getString(columnName: String) = getStringOrNull(columnName)!!
Extension Functions
fun Cursor.getStringOrNull(columnName: String): String? {

val nameColumnIndex = getColumnIndexOrThrow(columnName)

return if (isNull(nameColumnIndex)) null else getString(nameColumnIndex)

}



fun Cursor.getString(columnName: String) = getStringOrNull(columnName)!
val firstName = cursor!!.getString("nameColumn")
Function Expressions
{ it.toString() }
{ x, y -> x + y }
{ x: Int, y: Int -> x + y }
val sum: (Int, Int) -> Int = { x, y -> x + y }
val sum: (Int, Int) -> Int = { x: Int, y: Int -> x + y }
High-order Functions
public fun <T> Array<T>.filter(predicate: (T) -> Boolean): Array<T> {

return …

}
val versions = arrayOf("Gingerbread", “Honeycomb",

"Ice Cream Sandwich”,"Jelly Bean", "Lollipop")

val versionsWithBigLength = versions.filter { it.length > 10 }
High-order Functions
fun String.validateWith(predicate: (String) -> Boolean) =
predicate(this)
val validLength: (String) -> Boolean = { it.length > 10 }

"Kirill".validateWith(validLength)
Extension Function Expressions
• Extension Function - Функция, которая
добавляется к типу не модифицируя его.
• Function Expression - Необъявляемая функция,
которую можно использовать в качестве
выражения (например для передачи параметров
в метод)
• High-order function - Функция, которую
используют другую функцию как параметр либо
возвращает функция
Extension Function Expressions
fun SQLiteDatabase.transact(
transaction: SQLiteDatabase.() -> Unit) {

beginTransaction();

try {

transaction()

setTransactionSuccessful()

} finally {

endTransaction()

}

}
Extension Function Expressions
fun SQLiteDatabase.transact(
transaction: SQLiteDatabase.() -> Unit) {

beginTransaction();

try {

transaction()

setTransactionSuccessful()

} finally {

endTransaction()

}

}
val names = arrayOf("Ivan Invanov")

db.transact { delete("students", "name = ?", names) }
Extension Function Expressions
inline fun SQLiteDatabase.transact(
transaction: SQLiteDatabase.() -> Unit) {

beginTransaction();

try {

transaction()

setTransactionSuccessful()

} finally {

endTransaction()

}

}
Extension Function Expressions
val names = arrayOf("Ivan Invanov")

db.transact { delete("students", "name = ?", names) }
+
inline fun
=
db.beginTransaction();

try {

db.transaction()

db.setTransactionSuccessful()

} finally {

db.endTransaction()

}
Default Arguments
fun setViewVisible(visible: Boolean,

animate: Boolean = true) {

//...

}
public class Student {

private int course;

private String name;

private final Date birthday;



public Student(int course, @NotNull String name, @NotNull Date birthday) {

this.course = course;

this.name = name;

this.birthday = birthday;

}



public int getCourse() { return course; }

public void setCourse(int course) { this.course = course; }

@NotNull public String getName() { return name; }

public void setName(@NotNull String name) { this.name = name; }

@NotNull public Date getBirthday() { return birthday; }



@Override

public boolean equals(Object o) {

if (this == o) return true;

if (o == null || getClass() != o.getClass()) return false;



Student student = (Student) o;

return course == student.course

&& name.equals(student.name)

&& birthday.equals(student.birthday);

}



@Override

public int hashCode() {

int result = course;

result = 31 * result + name.hashCode();

result = 31 * result + birthday.hashCode();

return result;

}

}
Kotlin class
class Student(var course: Int,
var name: String,
val birthday: Date) {



override fun equals(other: Any?): Boolean {

if (this === other) return true

if (other?.javaClass != javaClass) return false



other as Student

return course == other.course

&& name == other.name

&& birthday != other.birthday

}



override fun hashCode(): Int {

var result = course

result += 31 * result + name.hashCode()

result += 31 * result + birthday.hashCode()

return result

}

}
Data class
data class Student(var course: Int,

var name: String,

val birthday: Date)
Singleton
public final class Singleton {



private static Singleton instance;



public static Singleton getInstance() {

if (instance == null) {

synchronized (Singleton.class) {

if (instance == null) {

instance = new Singleton();

}

}

}

return instance;

}



public void sayHello() {

System.out.println("Hello!");

}



private Singleton() {}

}
Object
object Singleton {

fun sayHello() = println("Hello!")

}
Коллекции
val names = listOf<String>(..) // Список только для чтения

names

.filter { it.startsWith("A") }

.sortedBy { it }

.map { it.toUpperCase() }

.forEach { print(it) }
Что еще
• Перегрузка операторов
• Type smart cast
• Range
• Расширенное API рефлексии
• Делегирование классов
• Делегирование свойств (Lazy, Observable и др.)
• Destructuring declarations
• Named arguments in function
• Tail recursive functions
• Нет проверяемых исключений
Полезные ссылки
• kotlinlang.org

Официальный сайт языка
• try.kotlinlang.org

Онлайн IDE
• github.com/JetBrains/kotlin

Исходны код проекта (лицензия Apache 2.0)

More Related Content

What's hot

10. java lecture generics&collections
10. java lecture generics&collections10. java lecture generics&collections
10. java lecture generics&collections
MERA_school
 
3. java lecture classes
3. java lecture classes3. java lecture classes
3. java lecture classes
MERA_school
 
5. java lecture io
5. java lecture io5. java lecture io
5. java lecture io
MERA_school
 
8. java lecture threads
8. java lecture threads8. java lecture threads
8. java lecture threads
MERA_school
 
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 3...
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 3...PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 3...
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 3...
pgdayrussia
 
Java осень 2013 лекция 2
Java осень 2013 лекция 2Java осень 2013 лекция 2
Java осень 2013 лекция 2
Technopark
 
Лекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные спискиЛекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные списки
Mikhail Kurnosov
 

What's hot (20)

10. java lecture generics&collections
10. java lecture generics&collections10. java lecture generics&collections
10. java lecture generics&collections
 
Why Every Language Needs Its Underscore
Why Every Language Needs Its UnderscoreWhy Every Language Needs Its Underscore
Why Every Language Needs Its Underscore
 
Функциональное программирование.Списки. Функции высших порядков
Функциональное программирование.Списки. Функции высших порядковФункциональное программирование.Списки. Функции высших порядков
Функциональное программирование.Списки. Функции высших порядков
 
3. java lecture classes
3. java lecture classes3. java lecture classes
3. java lecture classes
 
5. java lecture io
5. java lecture io5. java lecture io
5. java lecture io
 
Pyton – пробуем функциональный стиль
Pyton – пробуем функциональный стильPyton – пробуем функциональный стиль
Pyton – пробуем функциональный стиль
 
8. java lecture threads
8. java lecture threads8. java lecture threads
8. java lecture threads
 
07 - Java. Элементы функционального программирования в Java
07 - Java. Элементы функционального программирования в Java07 - Java. Элементы функционального программирования в Java
07 - Java. Элементы функционального программирования в Java
 
C#. От основ к эффективному коду
C#. От основ к эффективному кодуC#. От основ к эффективному коду
C#. От основ к эффективному коду
 
Scala
ScalaScala
Scala
 
Intro to Swift techitout
Intro to Swift techitoutIntro to Swift techitout
Intro to Swift techitout
 
Красота и изящность стандартной библиотеки Python
Красота и изящность стандартной библиотеки PythonКрасота и изящность стандартной библиотеки Python
Красота и изящность стандартной библиотеки Python
 
Yield at me 'cause I'm awaiting: асинхронные итераторы в C# 8
Yield at me 'cause I'm awaiting: асинхронные итераторы в C# 8Yield at me 'cause I'm awaiting: асинхронные итераторы в C# 8
Yield at me 'cause I'm awaiting: асинхронные итераторы в C# 8
 
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 3...
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 3...PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 3...
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 3...
 
Java осень 2013 лекция 2
Java осень 2013 лекция 2Java осень 2013 лекция 2
Java осень 2013 лекция 2
 
Лекция 1. Начало.
Лекция 1. Начало.Лекция 1. Начало.
Лекция 1. Начало.
 
05 - Java. Collections Framework и Generics
05 - Java. Collections Framework и Generics05 - Java. Collections Framework и Generics
05 - Java. Collections Framework и Generics
 
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
 
Лекция о языке программирования Haskell
Лекция о языке программирования HaskellЛекция о языке программирования Haskell
Лекция о языке программирования Haskell
 
Лекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные спискиЛекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные списки
 

Viewers also liked

Swift and Kotlin Presentation
Swift and Kotlin PresentationSwift and Kotlin Presentation
Swift and Kotlin Presentation
Andrzej Sitek
 

Viewers also liked (9)

Юрий Крутилин. Инструментарий для реверс-инжиниринга Android-приложений
Юрий Крутилин. Инструментарий для реверс-инжиниринга Android-приложений Юрий Крутилин. Инструментарий для реверс-инжиниринга Android-приложений
Юрий Крутилин. Инструментарий для реверс-инжиниринга Android-приложений
 
Лекция Android. БД SQLite, ContentProvider, Loader
Лекция Android. БД SQLite, ContentProvider, LoaderЛекция Android. БД SQLite, ContentProvider, Loader
Лекция Android. БД SQLite, ContentProvider, Loader
 
Gradle. Новый уровень автоматизации для Android
Gradle. Новый уровень автоматизации для AndroidGradle. Новый уровень автоматизации для Android
Gradle. Новый уровень автоматизации для Android
 
Меньше кода — больше сути. Внедрение Kotlin для разработки под Android. Илья...
 Меньше кода — больше сути. Внедрение Kotlin для разработки под Android. Илья... Меньше кода — больше сути. Внедрение Kotlin для разработки под Android. Илья...
Меньше кода — больше сути. Внедрение Kotlin для разработки под Android. Илья...
 
Security in Android Applications / Александр Смирнов (RedMadRobot)
Security in Android Applications / Александр Смирнов (RedMadRobot)Security in Android Applications / Александр Смирнов (RedMadRobot)
Security in Android Applications / Александр Смирнов (RedMadRobot)
 
Kotlin в production. Как и зачем?
Kotlin в production. Как и зачем?Kotlin в production. Как и зачем?
Kotlin в production. Как и зачем?
 
Swift and Kotlin Presentation
Swift and Kotlin PresentationSwift and Kotlin Presentation
Swift and Kotlin Presentation
 
Живые обои для Android. Как создать. Тонкости. Продвижение
Живые обои для Android. Как создать. Тонкости. ПродвижениеЖивые обои для Android. Как создать. Тонкости. Продвижение
Живые обои для Android. Как создать. Тонкости. Продвижение
 
Android service
Android serviceAndroid service
Android service
 

Similar to Kotlin для Android

Deep Dive C# by Sergey Teplyakov
Deep Dive  C# by Sergey TeplyakovDeep Dive  C# by Sergey Teplyakov
Deep Dive C# by Sergey Teplyakov
Alex Tumanoff
 
Михаил Давыдов — JavaScript: Базовые знания
Михаил Давыдов — JavaScript: Базовые знанияМихаил Давыдов — JavaScript: Базовые знания
Михаил Давыдов — JavaScript: Базовые знания
Yandex
 

Similar to Kotlin для Android (20)

Kotlin
KotlinKotlin
Kotlin
 
. Kotlin для Автоматизации тестирования – первые впечатления
. Kotlin для Автоматизации тестирования – первые впечатления. Kotlin для Автоматизации тестирования – первые впечатления
. Kotlin для Автоматизации тестирования – первые впечатления
 
Зачем нужна Scala?
Зачем нужна Scala?Зачем нужна Scala?
Зачем нужна Scala?
 
Statis code analysis
Statis code analysisStatis code analysis
Statis code analysis
 
Discovering Lambdas (Speech)
Discovering Lambdas (Speech)Discovering Lambdas (Speech)
Discovering Lambdas (Speech)
 
Lambdas in java 8
Lambdas in java 8Lambdas in java 8
Lambdas in java 8
 
Generics
GenericsGenerics
Generics
 
Deep Dive C# by Sergey Teplyakov
Deep Dive  C# by Sergey TeplyakovDeep Dive  C# by Sergey Teplyakov
Deep Dive C# by Sergey Teplyakov
 
Об особенностях использования значимых типов в .NET
Об особенностях использования значимых типов в .NETОб особенностях использования значимых типов в .NET
Об особенностях использования значимых типов в .NET
 
Lec 3
Lec 3Lec 3
Lec 3
 
[Expert Fridays] Java MeetUp - Борис Ташкулов (Teamlead Enterprise): "Почему ...
[Expert Fridays] Java MeetUp - Борис Ташкулов (Teamlead Enterprise): "Почему ...[Expert Fridays] Java MeetUp - Борис Ташкулов (Teamlead Enterprise): "Почему ...
[Expert Fridays] Java MeetUp - Борис Ташкулов (Teamlead Enterprise): "Почему ...
 
Swift School #2
Swift School #2Swift School #2
Swift School #2
 
Язык программирования C#
Язык программирования C#Язык программирования C#
Язык программирования C#
 
Java 8 puzzlers
Java 8 puzzlersJava 8 puzzlers
Java 8 puzzlers
 
[JAM 1.1] Clean Code (Paul Malikov)
[JAM 1.1] Clean Code (Paul Malikov)[JAM 1.1] Clean Code (Paul Malikov)
[JAM 1.1] Clean Code (Paul Malikov)
 
Scala for android
Scala for androidScala for android
Scala for android
 
C# Desktop. Занятие 03.
C# Desktop. Занятие 03.C# Desktop. Занятие 03.
C# Desktop. Занятие 03.
 
Bytecode
BytecodeBytecode
Bytecode
 
Михаил Давыдов — JavaScript: Базовые знания
Михаил Давыдов — JavaScript: Базовые знанияМихаил Давыдов — JavaScript: Базовые знания
Михаил Давыдов — JavaScript: Базовые знания
 
Kotlin with API tests
Kotlin with API testsKotlin with API tests
Kotlin with API tests
 

More from Kirill Rozov

More from Kirill Rozov (20)

Kotlin Coroutines. Flow is coming
Kotlin Coroutines. Flow is comingKotlin Coroutines. Flow is coming
Kotlin Coroutines. Flow is coming
 
2 years without Java. Kotlin only
2 years without Java. Kotlin only2 years without Java. Kotlin only
2 years without Java. Kotlin only
 
Почему Kotlin?
Почему Kotlin?Почему Kotlin?
Почему Kotlin?
 
KOIN for dependency Injection
KOIN for dependency InjectionKOIN for dependency Injection
KOIN for dependency Injection
 
Optimize APK size
Optimize APK sizeOptimize APK size
Optimize APK size
 
ConstraintLayout. Fell the Power of constraints
ConstraintLayout. Fell the Power of constraintsConstraintLayout. Fell the Power of constraints
ConstraintLayout. Fell the Power of constraints
 
Kotlin 1.2: Sharing code between platforms
Kotlin 1.2: Sharing code between platformsKotlin 1.2: Sharing code between platforms
Kotlin 1.2: Sharing code between platforms
 
Kotlin - следующий язык после Java
Kotlin - следующий язык после JavaKotlin - следующий язык после Java
Kotlin - следующий язык после Java
 
Kotlin Advanced - Apalon Kotlin Sprint Part 3
Kotlin Advanced - Apalon Kotlin Sprint Part 3Kotlin Advanced - Apalon Kotlin Sprint Part 3
Kotlin Advanced - Apalon Kotlin Sprint Part 3
 
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
 
Why Kotlin - Apalon Kotlin Sprint Part 1
Why Kotlin - Apalon Kotlin Sprint Part 1Why Kotlin - Apalon Kotlin Sprint Part 1
Why Kotlin - Apalon Kotlin Sprint Part 1
 
Тестирование на Android с Dagger 2
Тестирование на Android с Dagger 2Тестирование на Android с Dagger 2
Тестирование на Android с Dagger 2
 
Что нового в Android O (Grodno HTP)
Что нового в Android O (Grodno HTP)Что нового в Android O (Grodno HTP)
Что нового в Android O (Grodno HTP)
 
What's new in Android O
What's new in Android OWhat's new in Android O
What's new in Android O
 
Effective Java
Effective JavaEffective Java
Effective Java
 
Dagger 2
Dagger 2Dagger 2
Dagger 2
 
Gradle Introduction
Gradle IntroductionGradle Introduction
Gradle Introduction
 
REST
RESTREST
REST
 
What's new in Android M
What's new in Android MWhat's new in Android M
What's new in Android M
 
Android Data Binding
Android Data BindingAndroid Data Binding
Android Data Binding
 

Kotlin для Android

  • 2. Зачем нужен Kotlin для Android? • Ограничения языка Java и его проблемы • Нельзя добавить методы для типов, определенных платформой либо сторонней библиотекой (ад из “*Util” классов) • Проблемы с null • Отсутсвие немодифицируемых коллекций
  • 3. Зачем нужен Kotlin для Android? • Android поддерживает только Java 6 • Нет Java 8 Date API • Нет Stream API для коллекций • Нет лямбда выражений, ссылок на методы, замыканий • Try-with-resource (только для Android 4.4+) • Проверка на null повсюду
  • 4. Зачем нужен Kotlin для Android? • Проблемы дизайна Android API • Сложная иерархия • NPE повсюду • Сложное в использование API
  • 5. Variables val sample: String = "Sample String"
  • 6. Variables val sample: String = "Sample String”
 val sample = "Sample String” val sample: List<String> = ArrayList()
  • 7. Variables val sample: String = null COMPILE ERROR
  • 8. Variables val sample: String? = null sample?.trim() sample!!.trim()
  • 9. Lazy Variables class SampleFragment : Fragment() { val margin: Int by lazy { resources.getDimensionPixelSize(R.dimen.std_margin) } }
  • 10. String Templates val student = Student(1, "Ivan Ivanov", Date())
 println("Student '${student.name}' is on ${student.course} course.")
  • 11. Functions fun sum(a: Int, b: Int): Int {
 return a + b
 }
  • 12. Single-Expression Functions fun sum(a: Int, b: Int): Int = a + b
  • 14. Extension Functions public final class CalendarUtils {
 
 public static boolean isMonday(Calendar calendar) {
 return calendar.get(Calendar.DAY_OF_WEEK) == Calendar.MONDAY;
 }
 } Calendar calendar = Calendar.getInstance();
 boolean isMonday = CalendarUtils.isMonday(calendar);
  • 15. Extension Functions fun Calendar.isMonday(): Boolean {
 return get(Calendar.DAY_OF_WEEK) == Calendar.MONDAY
 } val calendar = Calendar.getInstance() val isMonday = calendar.isMonday()
  • 16. Extension Functions fun Calendar.isMonday() = get(Calendar.DAY_OF_WEEK) == Calendar.MONDAY val calendar = Calendar.getInstance() val isMonday = calendar.isMonday()
  • 17. Extension Functions fun View.setPaddingTop(padding: Int) {
 setPadding(paddingLeft, padding, paddingRight, paddingBottom)
 }
  • 18. Extension Functions String name = null;
 int nameColumnIndex =
 cursor.getColumnIndexOrThrow("nameColumn");
 if (!cursor.isNull(nameColumnIndex)) {
 name = cursor.getString(nameColumnIndex);
 } fun Cursor.getStringOrNull(columnName: String): String? {
 val nameColumnIndex = getColumnIndexOrThrow(columnName)
 return if (isNull(nameColumnIndex)) null else getString(nameColumnIndex)
 }
 
 fun Cursor.getString(columnName: String) = getStringOrNull(columnName)!!
  • 19. Extension Functions fun Cursor.getStringOrNull(columnName: String): String? {
 val nameColumnIndex = getColumnIndexOrThrow(columnName)
 return if (isNull(nameColumnIndex)) null else getString(nameColumnIndex)
 }
 
 fun Cursor.getString(columnName: String) = getStringOrNull(columnName)! val firstName = cursor!!.getString("nameColumn")
  • 20. Function Expressions { it.toString() } { x, y -> x + y } { x: Int, y: Int -> x + y } val sum: (Int, Int) -> Int = { x, y -> x + y } val sum: (Int, Int) -> Int = { x: Int, y: Int -> x + y }
  • 21. High-order Functions public fun <T> Array<T>.filter(predicate: (T) -> Boolean): Array<T> {
 return …
 } val versions = arrayOf("Gingerbread", “Honeycomb",
 "Ice Cream Sandwich”,"Jelly Bean", "Lollipop")
 val versionsWithBigLength = versions.filter { it.length > 10 }
  • 22. High-order Functions fun String.validateWith(predicate: (String) -> Boolean) = predicate(this) val validLength: (String) -> Boolean = { it.length > 10 }
 "Kirill".validateWith(validLength)
  • 23. Extension Function Expressions • Extension Function - Функция, которая добавляется к типу не модифицируя его. • Function Expression - Необъявляемая функция, которую можно использовать в качестве выражения (например для передачи параметров в метод) • High-order function - Функция, которую используют другую функцию как параметр либо возвращает функция
  • 24. Extension Function Expressions fun SQLiteDatabase.transact( transaction: SQLiteDatabase.() -> Unit) {
 beginTransaction();
 try {
 transaction()
 setTransactionSuccessful()
 } finally {
 endTransaction()
 }
 }
  • 25. Extension Function Expressions fun SQLiteDatabase.transact( transaction: SQLiteDatabase.() -> Unit) {
 beginTransaction();
 try {
 transaction()
 setTransactionSuccessful()
 } finally {
 endTransaction()
 }
 } val names = arrayOf("Ivan Invanov")
 db.transact { delete("students", "name = ?", names) }
  • 26. Extension Function Expressions inline fun SQLiteDatabase.transact( transaction: SQLiteDatabase.() -> Unit) {
 beginTransaction();
 try {
 transaction()
 setTransactionSuccessful()
 } finally {
 endTransaction()
 }
 }
  • 27. Extension Function Expressions val names = arrayOf("Ivan Invanov")
 db.transact { delete("students", "name = ?", names) } + inline fun = db.beginTransaction();
 try {
 db.transaction()
 db.setTransactionSuccessful()
 } finally {
 db.endTransaction()
 }
  • 28. Default Arguments fun setViewVisible(visible: Boolean,
 animate: Boolean = true) {
 //...
 }
  • 29. public class Student {
 private int course;
 private String name;
 private final Date birthday;
 
 public Student(int course, @NotNull String name, @NotNull Date birthday) {
 this.course = course;
 this.name = name;
 this.birthday = birthday;
 }
 
 public int getCourse() { return course; }
 public void setCourse(int course) { this.course = course; }
 @NotNull public String getName() { return name; }
 public void setName(@NotNull String name) { this.name = name; }
 @NotNull public Date getBirthday() { return birthday; }
 
 @Override
 public boolean equals(Object o) {
 if (this == o) return true;
 if (o == null || getClass() != o.getClass()) return false;
 
 Student student = (Student) o;
 return course == student.course
 && name.equals(student.name)
 && birthday.equals(student.birthday);
 }
 
 @Override
 public int hashCode() {
 int result = course;
 result = 31 * result + name.hashCode();
 result = 31 * result + birthday.hashCode();
 return result;
 }
 }
  • 30. Kotlin class class Student(var course: Int, var name: String, val birthday: Date) {
 
 override fun equals(other: Any?): Boolean {
 if (this === other) return true
 if (other?.javaClass != javaClass) return false
 
 other as Student
 return course == other.course
 && name == other.name
 && birthday != other.birthday
 }
 
 override fun hashCode(): Int {
 var result = course
 result += 31 * result + name.hashCode()
 result += 31 * result + birthday.hashCode()
 return result
 }
 }
  • 31. Data class data class Student(var course: Int,
 var name: String,
 val birthday: Date)
  • 32. Singleton public final class Singleton {
 
 private static Singleton instance;
 
 public static Singleton getInstance() {
 if (instance == null) {
 synchronized (Singleton.class) {
 if (instance == null) {
 instance = new Singleton();
 }
 }
 }
 return instance;
 }
 
 public void sayHello() {
 System.out.println("Hello!");
 }
 
 private Singleton() {}
 }
  • 33. Object object Singleton {
 fun sayHello() = println("Hello!")
 }
  • 34. Коллекции val names = listOf<String>(..) // Список только для чтения
 names
 .filter { it.startsWith("A") }
 .sortedBy { it }
 .map { it.toUpperCase() }
 .forEach { print(it) }
  • 35. Что еще • Перегрузка операторов • Type smart cast • Range • Расширенное API рефлексии • Делегирование классов • Делегирование свойств (Lazy, Observable и др.) • Destructuring declarations • Named arguments in function • Tail recursive functions • Нет проверяемых исключений
  • 36. Полезные ссылки • kotlinlang.org
 Официальный сайт языка • try.kotlinlang.org
 Онлайн IDE • github.com/JetBrains/kotlin
 Исходны код проекта (лицензия Apache 2.0)