Android джедая путь
Ivan Balaksha
#JavaMeetup
public void readFileLineByLine(){
BufferedReader buffReader = null;
try {
...
} catch (IOException ioe){
...
} finally {
if (buffReader != null){
try {
buffReader.close();
} catch (IOException ioe1){
...
}
}
}
...
}
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
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
...
}Совместимость
Java code
Kotlin code
javac
kotlinc
bytecode
DEX
Время компиляции
Java
Kotlin
Scala
+
+/–
–
Размер стандартной библиотеки
+
–
(~6k методов)
(~50k методов)
fun loadImage(url: URL) = async {
val bytes = await(loadBytes(url))
bytesToImage(bytes)
}typealias Action<T> = (T) -> Unit
typealias Length = Double
typealias Weight = Doublefun 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()
}
}https://kotlinlang.org/docs/reference/
http://try.kotlinlang.org
https://blog.jetbrains.com
Ivan Balaksha
@VanyaBalaksha
https://slides.com/ivanbalaksha