Upload
artur-burakov
View
262
Download
8
Embed Size (px)
Citation preview
Новый язык программирования от JetBrains
Андрей Лапшин
KSI
2015-12-25
Что это?
Cтатический типизированный язык программирования для JVM, Android и Javascript от JetBrains:
� AppCode �IntelliJ IDEA
.., Android Studio
Зачем нужен новый язык?
Android 1.0 Android 4.4
На Android на данный момент доступна Java 6 (Java 7, если minSdkVersion=19), в то время как уже выпущена Java 8 и разрабатывается Java 9 ( сентябрь 2016)
Java 6 Java 7 Java 8
2006 2008 2011 2013 2014 20xx
Android ???
Marshmallow (0.5 %)
Lollipop (29.5 %)
Kitkat (36.6 %)
Jelly Bean (26.9
%)
Ice Cream Sandwich (2.9 %)
Gingerbread + Froyo (3.6
%)
Зачем нужен новый язык?
Недостатки Java 6 �Нет javax.time �Нет Streams API �Нет лямбд �Нет try-with-
resources
Зачем нужен новый язык?
Недостатки Java 6 �Нет javax.time
ThreeTenABP �Нет Streams API �Нет лямбд �Нет try-with-
resources
Зачем нужен новый язык?
Недостатки Java 6 �Нет javax.time
ThreeTenABP �Нет Streams API
StreamSupport/RxJava
�Нет лямбд �Нет try-with-
resources
Зачем нужен новый язык?
Недостатки Java 6 �Нет javax.time ThreeTenABP �Нет Streams API StreamSupport/RxJava �Нет лямбд Retrolambda �Нет try-with-resources
Зачем нужен новый язык?
Недостатки Java 6 �Нет javax.time ThreeTenABP �Нет Streams API StreamSupport/RxJava �Нет лямбд Retrolambda � Нет try-with-resources Retrolambda/minSdkVersion=19
Зачем нужен новый язык?
Недостатки Java в целом � Необходимость наследования от системных классов
Зачем нужен новый язык?
Недостатки Java в целом � Необходимость наследования от системных классов
� Невозможность расширения функциональности существующих классов (накапливается множество мелких Util-классов)
Зачем нужен новый язык?
Недостатки Java в целом � Необходимость наследования от системных классов
� Невозможность расширения функциональности существующих классов (накапливается множество мелких Util-классов)
�Проблемы при работе c null
Зачем нужен новый язык?
Недостатки Java в целом � Необходимость наследования от системных классов
� Невозможность расширения функциональности существующих классов (накапливается множество мелких Util-классов)
�Проблемы при работе c null � Многословие
Почему именно Kotlin
�100% совместим с Java �Отличные инструменты разработки
� Сравнительно небольшой размер рантайма (≈950K) и количество методов (≈7900)
Базовый синтаксФункцииfun sum(a: I n t , b : I n t ) : I n t {
return a + b}
Базовый синтаксФункцииfun sum(a: I n t , b : I n t ) : I n t {
return a + b}
fun d i f f ( a : I n t , b : I n t ) = a - b
Базовый синтаксФункцииfun sum(a: I n t , b : I n t ) : I n t {
return a + b}
fun d i f f ( a : I n t , b : I n t ) = a - b
Переменныеva l a : I n t = 1va l b = 1 / / Автовыведение типа
var x = 5 / / Изменяемая переменнаяx += 1
Классы, свойстваclass Person {
va l name = "Vasya Pupkin"}
Классы, свойстваclass Person const ruc tor (name: S t r i n g ) {
va l name = name}
Классы, свойстваclass Person c o n s t r u c t o r ( v a l name: S t r i n g ) {}
Классы, свойстваclass Person(val name: S t r i n g ) {}va l person = Person("Joe Smi th " )
Работа с null
var a : S t r i n g = " abc"a = n u l l / / ошибка компиляции
Работа с null
var a : S t r i n g = " abc"a = n u l l / / ошибка компиляции
var b : S t r i ng ? = "abc" b = n u l l / / ok
Работа с null
var a : S t r i n g = "abc"a = n u l l / / ошибка компиляции
var b : S t r i n g? = "abc" b = n u l l / / ok
va l l 1 = a . l e n g t h / / okva l l 2 = b . l e n g t h / / ошибка: ' b ' может быть n u l l
Работа с nullЯвная проверка на nullva l l = i f ( b ! = n u l l ) b . l e n g t h else - 1
Работа с nullЯвная проверка на nullva l l = i f ( b ! = n u l l ) b . l e n g t h else - 1Использование оператора ?va l l = b? . l eng t hva l name = bob?.department?.head?.name
Работа с nullЯвная проверка на nullva l l = i f ( b ! = n u l l ) b . l e n g t h else - 1Использование оператора ?va l l = b? . l eng t hva l name = bob?.department?.head?.nameИспользование оператора !!va l l = b ! ! . l e n g t h ( )
Extension functions
s t a t i c boolean i sVeryLong (St r ing s ) {return s . l e n g t h ( ) > 80 ;
}boolean tooLong = Te x t U t i l s . i s To o L o n g ( s ) ;
Extension functions
s t a t i c boolean i sVeryLong (St r ing s ) {return s . l e n g t h ( ) > 80 ;
}boolean tooLong = Te x t U t i l s . i s To o L o n g ( s ) ;
fun St r i ng . i sTo oLon g ( ) {return l e n g t h ( ) > 80
}va l tooLong = s . i sTooLong( )
Лямбды
but ton .setOnCl ickL is tener (new View .OnC l i c k L is tene r ( ) {public void onCLick(View v )
{ Toas t . mak eTex t ( My Ac t i v i t y . t h i s , "Some t e x t " , Toast.LENGTH_SHORT).show();
}} ) ;
Лямбды
but ton .setOnCl ickL is tener (new View .OnC l i c k L is tene r ( ) {public void onCLick(View v )
{ Toas t . mak eTex t ( My Ac t i v i t y . t h i s , "Some t e x t " , Toast.LENGTH_SHORT).show();
}} ) ;
bu t ton .s e t On Cl i c k L i s te ne r ( v -> Toas t . mak eTex t ( My Ac t i v i t y . t h i s , "Some t e x t " , Toast.LENGTH_SHORT).show();
} ) ;
Лямбды
but ton .setOnCl ickL is tener (new View .OnC l i c k L is tene r ( ) {public void onCLick(View v )
{ Toas t . mak eTex t ( My Ac t i v i t y . t h i s , "Some t e x t " , Toast.LENGTH_SHORT).show();
}} ) ;
bu t ton .s e t On Cl i c k L i s te ne r ( v -> Toas t . mak eTex t ( My Ac t i v i t y . t h i s , "Some t e x t " , Toast.LENGTH_SHORT).show();
} ) ;
b u t t o n . s e t O nC l i c k L i s t e ne r ( { v : View -> Toas t .mak eTex t (My Ac t i v i t y. th is , "Some t e x t " , Toast.LENGTH_SHORT).show()
} )
Лямбды
but ton .setOnCl ickL is tener (new View .OnC l i c k L is tene r ( ) {public void onCLick(View v )
{ Toas t . mak eTex t ( My Ac t i v i t y . t h i s , "Some t e x t " , Toast.LENGTH_SHORT).show();
}} ) ;
bu t ton .s e t On Cl i c k L i s te ne r ( v -> Toas t . mak eTex t ( My Ac t i v i t y . t h i s , "Some t e x t " , Toast.LENGTH_SHORT).show();
} ) ;
b u t t o n . s e t O nC l i c k L i s t e ne r ( { v : View -> Toas t .mak eTex t (My Ac t i v i t y. th is , "Some t e x t " , Toast.LENGTH_SHORT).show()
} )
bu t ton .s e tOnC l i c k L is tene r { Toas t .mak eTex t (MyAc t i v i t y. th is , "Some t e x t " , Toast.LENGTH_SHORT).show()
}
Функции высшего порядкаfun<T> L i s t < T > . f i l t e r ( p r e d i c a t e : ( T ) - > Boo lean) :
/ / . . .}
Функции высшего порядкаfun<T> L i s t < T > . f i l t e r ( p r e d i c a t e : ( T ) - > Boo lean) :
va l r e s u l t L i s t = A r r ayL i s t <T >( )f o r ( i t e m i n t h i s ) {
i f ( p r e d i c a t e ( i t e m ) ) { r e s u l t L i s t . a d d ( i te m )
}}
return r e s u l t L i s t}
Функции высшего порядкаfun<T> L i s t < T > . f i l t e r ( p r e d i c a t e : ( T ) - > Boo lean) :
va l r e s u l t L i s t = A r r a yL i s t < T> ( )f o r ( i t e m i n t h i s ) {
i f ( p r e d i c a t e ( i t e m ) ) { r e s u l t L i s t . a d d ( i te m )
}}
return r e s u l t L i s t}
va l numbers = l i s t O f ( 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 0 )va l oddNumbers = n u m b e r s . f i l t e r { i t % 2 ! = 0 }
Функции высшего порядкаdb . beg inTr ans ac t io n ( ) ;t r y {
d b . d e l e t e ( " u s e r s " , " f i r s t _name = ? " , new S t r i n g [ ] {} f i n a l l y {
db .endTr ans ac t i on ( ) ;}
Функции высшего порядкаdb . beg inTr ans ac t io n ( ) ;t r y {
d b . d e l e t e ( " u s e r s " , " f i r s t _name = ? " , new S t r i n g [ ] { db . s e t Tr ans ac t io nSu c c es s fu l ( ) ;
} f i n a l l y {db .endTr ans ac t i on ( ) ;
}
Функции высшего порядкаfun SQLi teDatabase. inTransact ion( func : ( ) - > U n i t )
{ beg inTrans ac t ion( )t r y {
f u n c ( ) se tTransac t ionSucc ess fu l ( )
} f i n a l l y {endTransac t ion( )
}}
db . i nTrans ac t i on {d b . d e l e t e ( " u s e r s " , " f i r s t _name
= ? " , ar rayOf( "Vasya"}
Функции высшего порядкаfun SQLi teDatabase . inTransact ion(
f u n c : (SQLiteDatabase) -> U n i t ) { beg inTrans ac t ion( )
t r y {f u n c ( t h i s )
se tTransac t ionSucc ess fu l ( )} f i n a l l y {
endTransac t ion( )}
}
db . inTrans ac t ion {i t . d e l e t e ( " u s e r s " ,
" f i r s t _name = ? " , ar rayOf ( "Vasya"
}
Функции высшего порядкаfun SQLi teDatabase . inTransact ion(
f u n c : SQLi teDatabase. ( ) - > U n i t ) { beg inTrans ac t ion( )
t r y {t h i s . f u n c ( )
se tTransac t ionSucc ess fu l ( )} f i n a l l y {
endTransac t ion( )}
}
db . inTrans ac t ion {d e l e t e ( " u s e r s " ,
" f i r s t _name = ? " , a r rayOf ( "Vasya" )}
Функции высшего порядкаi n l i n e fun
SQLi teDatabase . inTransact ion( f u nc : SQLi teDatabase. ( ) - > U n i t ) {
beg inTransac t ion( )t r y {t h i s . f u n c ( )
se tTransac t ionSucc ess fu l ( )} f i n a l l y {endTransac t ion( )}}
db . i nTrans ac t i on {d e l e t e ( " u s e r s " , " f i r s t _name = ? " ,
a r rayOf ( "Vasya" )}
Документация и полезные ссылки
Сайт и документация:h t t p s : / / k o t l i n l a n g . o r gОнлайн IDE:h t t p : / / t r y . k o t l i n l a n g . o r gПрезентация Джейка Уортона (Jake Wharton) о языке (англ.):Android Development with KotlinМотивации для использования и сравнение с другими языками под JVM (англ.):Using Project Kotlin for Android