
Android джедая путь
Ivan Balaksha

#JavaMeetup
Что не так с Java?
Проверяемые исключения
public void readFileLineByLine(){
BufferedReader buffReader = null;
try {
...
} catch (IOException ioe){
...
} finally {
if (buffReader != null){
try {
buffReader.close();
} catch (IOException ioe1){
...
}
}
}
...
}
NPE HELL*
public void doSmth(JavaUser user){
if(user != null){
String login = user.getLogin();
if(login != null){
System.out.println("Hello " + login);
}
}
}*JSR 305: Annotations for Software Defect Detection
Синтаксис анонимных классов*
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
...
}
});*JSR 335: Lambda Expressions


Статически типизированный язык программирования для Android, JVM и веб разработки
100% совместимость с Java™

- Выразительность
- Безопасность
- Универсальность
- Совместимость
Почему Kotlin?
Выразительность
fun main(args: Array<String>) {
println("Hello World")
}Hello World
val firstName : String = "Ivan"
val lastName : String = "Balaksha"
var age : Int = 21Свойства + Вывод типов*
val firstName = "Ivan"
val lastName = "Balaksha"
var age = 21*JEP 286: Local-Variable Type Inference
val i : Int = ...
val f : Float = ...
val d : Double = ...
Отсутствие примитивных типов
button.setOnClickListener(object : View.OnClickListener{
override fun onClick(v: View?) {
doAnything()
}
})
Лямбда выражения
button.setOnClickListener(object : View.OnClickListener{
override fun onClick(v: View?) {
doAnything()
}
})
button.setOnClickListener(View.OnClickListener {
doAnything()
})Лямбда выражения
button.setOnClickListener(object : View.OnClickListener{
override fun onClick(v: View?) {
doAnything()
}
})
button.setOnClickListener(View.OnClickListener {
doAnything()
})
button.setOnClickListener { doAnything() }
Лямбда выражения
button.setOnClickListener(object : View.OnClickListener{
override fun onClick(v: View?) {
doAnything()
}
})
button.setOnClickListener(View.OnClickListener {
doAnything()
})
button.setOnClickListener { doAnything() }
button.onClick { doAnything() } (Anko)Лямбда выражения
data class KotlinUser(val login : String,val password : String)
Дата классы
equals()
hashCode()
toString()
Автоматически генерируются:
Стандартные значения для параметров функции
...
addContact("Ivan", "Balaksha", email = "test@test.test")
}
fun addContact(firstName: String,
lastName: String,
phone: String = "",
email: String = ""){
...
}Именованный аргумент
"Single-expression" функции
fun findUser(id : Int) = dataStore.find(id)
fun findUser(id : Int) : User{
return dataStore.find(id)
}Строковые шаблоны
val user = KotlinUser("admin","pwd")
val userInfo = "Login: ${user.login} Password: ${user.password}"Умные преобразования
fun demo(x: Any) {
if (x is String) {
print(x.length)
}else if(x is Int){
print(x + x)
}
}Функции расширения
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
this.alert { }
alert { }
...
}
}
class BlankFragment : Fragment() {
override fun onCreateView(...): View? {
getActivity().alert { }
activity.alert { }
return super.onCreateView(inflater, container, savedInstanceState)
}
}fun Context.alert(init: AlertDialogBuilder.() -> Unit)
= AlertDialogBuilder(this).apply { init() }when
val type = ...
val imageUrl = when(type){
1 -> ...
2 -> ...
3 -> ...
else -> ...
}with
recyclerView.adapter = ...
recyclerView.layoutManager = ...
recyclerView.visibility = ...
recyclerView.addOnItemTouchListener(...)with(recyclerView) {
adapter = ...
layoutManager = ...
visibility = ...
addOnItemTouchListener(...)
}Коллекции
associate
binarysearch
count
distinct/distinctBy
drop
dropWhile
find
fold
first
filter
flatMap
forEach
groupBy
getOrElse
indexOfFirst
indexOfLast
map
max/min
reduce
take
takeWhile
sort/sortBy
zip
...
Коллекции
names
.filter { it.startsWith("A") }
.sortedBy { it }
.map { it.toUpperCase() }
.forEach { print(it) }Безопасность
Nullable типы
val user : User? = null
var notification : Notification? = nullval name : String = nullОшибка компиляции
val name : String? = null
println(name?.length)ничего не напечатает
var name : String = "testString"
name = nullОшибка компиляции
val name : String? = null
println(name!!.length)Ошибка выполнения
Оператор безопасного вызова
val name : String? = ...
val length = name?.lenghtЭлвис оператор
val name : String? = ...
val length = name?.length ?: 0let
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val info : String? = savedInstanceState?.getString("info")
info?.let { process(it) }
...
}Безопасные преобразования
fun process(a : Any){
val aInt: Int? = a as? Int
...
}Универсальность
Многоцелевой язык программирования, позволяющий создавать приложения любых типов
- Android
- Back-end
- Front-end(Javascript)
- ...
Совместимость
Совместимость
Java code
Kotlin code
javac
kotlinc
bytecode
DEX


Время компиляции
Java
Kotlin
Scala
+
+/–
–
Размер стандартной библиотеки
+
–
(~6k методов)
(~50k методов)
Что-то еще?
- Ленивые свойства
- Интерфейсы с поддержкой "стандартных методов"
- Перезагрузка операторов
- Anko
- Android Extension Plugin
Что планируется в Kotlin 1.1
- Async-await
- Type aliases
- Data class hierarchy support
- Bound method references
- Улучшенная поддержка Java 8
- Javascript backend
- Local delegated properties & Inline properties
Async-Await
fun loadImage(url: URL) = async {
val bytes = await(loadBytes(url))
bytesToImage(bytes)
}Typealiases
typealias Action<T> = (T) -> Unit
typealias Length = Double
typealias Weight = DoubleLocal delegated properties & Inline properties
fun example(foo: (Bar) -> Foo,bar : Bar){
val memoizedFoo by lazy { foo(bar) }
// use memoizedFoo instead of foo to get it computed at most once
if (someCondition && memoizedFoo.isValid()) {
memoizedFoo.doSomething()
}
}Хотите использовать у себя в проекте?
- Установить Kotlin плагин
- Tools->Kotlin->Configure Kotlin in Project
- Gradle sync
Ресурсы
https://kotlinlang.org/docs/reference/
http://try.kotlinlang.org
https://blog.jetbrains.com
Q/A
Ivan Balaksha
@VanyaBalaksha
https://slides.com/ivanbalaksha
Kotlin - Android джедая путь(RUS) v2
By Ivan Balaksha
Kotlin - Android джедая путь(RUS) v2
- 730