Scala overview

Scala overview

28832e0d64ab5e5b21c9a78c02d8aefc?s=128

Eugene Dzhurinsky

August 18, 2014
Tweet

Transcript

  1. Краткий обзор #Scala Познание глубины глубин Приборы и материалы. Вместо

    заключения. Scala. Eugene Dzhurinsky Eugene Dzhurinsky Scala 1/14 github://jdevelop/sip
  2. Краткий обзор #Scala Познание глубины глубин Приборы и материалы. Вместо

    заключения. Почему именно Scala? Та же Java, но в профиль? Статическая типизация. Богатая система типов (генерики на стероидах). Вывод типов. Тот же самый байткод. 100% совместимость с любыми Java-библиотеками (обратное, впрочем, не верно). Краткость - сестра таланта. Синтаксический сахар. Функции высшего порядка. Лямбды. Замыкания. Eugene Dzhurinsky Scala 2/14 github://jdevelop/sip
  3. Краткий обзор #Scala Познание глубины глубин Приборы и материалы. Вместо

    заключения. Почему именно Scala? Та же Java, но в профиль? Статическая типизация. Богатая система типов (генерики на стероидах). Вывод типов. Тот же самый байткод. 100% совместимость с любыми Java-библиотеками (обратное, впрочем, не верно). Краткость - сестра таланта. Синтаксический сахар. Функции высшего порядка. Лямбды. Замыкания. Eugene Dzhurinsky Scala 2/14 github://jdevelop/sip
  4. Краткий обзор #Scala Познание глубины глубин Приборы и материалы. Вместо

    заключения. Почему именно Scala? Та же Java, но в профиль? Статическая типизация. Богатая система типов (генерики на стероидах). Вывод типов. Тот же самый байткод. 100% совместимость с любыми Java-библиотеками (обратное, впрочем, не верно). Краткость - сестра таланта. Синтаксический сахар. Функции высшего порядка. Лямбды. Замыкания. Eugene Dzhurinsky Scala 2/14 github://jdevelop/sip
  5. Краткий обзор #Scala Познание глубины глубин Приборы и материалы. Вместо

    заключения. Почему именно Scala? Та же Java, но в профиль? Статическая типизация. Богатая система типов (генерики на стероидах). Вывод типов. Тот же самый байткод. 100% совместимость с любыми Java-библиотеками (обратное, впрочем, не верно). Краткость - сестра таланта. Синтаксический сахар. Функции высшего порядка. Лямбды. Замыкания. Eugene Dzhurinsky Scala 2/14 github://jdevelop/sip
  6. Краткий обзор #Scala Познание глубины глубин Приборы и материалы. Вместо

    заключения. Почему именно Scala? Та же Java, но в профиль? Статическая типизация. Богатая система типов (генерики на стероидах). Вывод типов. Тот же самый байткод. 100% совместимость с любыми Java-библиотеками (обратное, впрочем, не верно). Краткость - сестра таланта. Синтаксический сахар. Функции высшего порядка. Лямбды. Замыкания. Eugene Dzhurinsky Scala 2/14 github://jdevelop/sip
  7. Краткий обзор #Scala Познание глубины глубин Приборы и материалы. Вместо

    заключения. Пример типичного бина на #Java package sample ; p u b l i c c l a s s Engine { p r o t e c t e d f i n a l i n t power , maxRpm, minRpm ; p u b l i c Engine ( i n t power , i n t maxRpm, i n t minRpm) { t h i s . power = power ; t h i s .maxRpm = maxRpm; t h i s . minRpm = minRpm ; } p u b l i c i n t getPower ( ) { r e t u r n power ; } p u b l i c i n t getMaxRpm ( ) { r e t u r n maxRpm; } p u b l i c i n t getMinRpm ( ) { r e t u r n minRpm ; } @Override p u b l i c boolean e q u a l s ( Object o ) { i f ( t h i s == o ) r e t u r n t r u e ; i f ( o == n u l l | | g e t C l a s s ( ) != o . g e t C l a s s ( ) ) r e t u r n f a l s e ; Engine e n g i n e = ( Engine ) o ; i f (maxRpm != e n g i n e .maxRpm) r e t u r n f a l s e ; i f (minRpm != e n g i n e . minRpm) r e t u r n f a l s e ; i f ( power != e n g i n e . power ) r e t u r n f a l s e ; r e t u r n t r u e ; } @Override p u b l i c i n t hashCode ( ) { i n t r e s u l t = power ; r e s u l t = 31 * r e s u l t + maxRpm; r e s u l t = 31 * r e s u l t + minRpm ; r e t u r n r e s u l t ; } @Override p u b l i c S t r i n g t o S t r i n g ( ) { r e t u r n " Engine {" + " power=" + power + " , maxRpm=" + maxRpm + " , minRpm=" + minRpm + ’ } ’ ; } } Eugene Dzhurinsky Scala 3/14 github://jdevelop/sip
  8. Краткий обзор #Scala Познание глубины глубин Приборы и материалы. Вместо

    заключения. Пример типичного бина на #Scala package sample import s c a l a . beans . BeanProperty c a s e c l a s s SEngine ( @BeanProperty power : Int , @BeanProperty maxRpm: Int , @BeanProperty minRpm : I n t ) Eugene Dzhurinsky Scala 4/14 github://jdevelop/sip
  9. Краткий обзор #Scala Познание глубины глубин Приборы и материалы. Вместо

    заключения. Val и Var. Вывод типов и интерполяция строк. package sample o b j e c t ValVarExample extends App { v a l something = 10 v a l som e t h i n g I n t : I n t = 20 p r i n t l n ( s " Something i s $something , another something i s $somethingInt " ) // something = 20 - doesn’t compile var mutableSomething = 10 p r i n t l n ( s " Mutable ? $mutableSomething " ) mutableSomething = 20 p r i n t l n ( s " Mutable ! $mutableSomething " ) } Eugene Dzhurinsky Scala 5/14 github://jdevelop/sip
  10. Краткий обзор #Scala Познание глубины глубин Приборы и материалы. Вместо

    заключения. Val и Var в Java или как натянуть сову на глобус. package sample ; p u b l i c c l a s s JValVarExample { s t a t i c i n t something ; s t a t i c i n t s o m e t h i n g I n t ; s t a t i c i n t mutableSomething ; p u b l i c s t a t i c void main ( S t r i n g [ ] a r g s ) throws Exception { something = 1 0 ; somet h i n g I n t = 2 0 ; System . out . p r i n t l n ( S t r i n g . format ( " Something i s %1$d , another something i s %2$d" , something , s o m e t h i n g I n t ) ) ; something = 2 0 ; // you can’t have a true "val" here - the closest would be "final" // however you can’t initialize a "static final " in "main" mutableSomething = 1 0 ; System . out . p r i n t l n ( S t r i n g . format ( " Mutable ? %1$d" , mutableSomething ) ) ; mutableSomething = 2 0 ; System . out . p r i n t l n ( S t r i n g . format ( " Mutable ! %1$d" , mutableSomething ) ) ; } } Eugene Dzhurinsky Scala 6/14 github://jdevelop/sip
  11. Краткий обзор #Scala Познание глубины глубин Приборы и материалы. Вместо

    заключения. Ленивые переменные, trait, “генерики” и неявные преобразования package sample o b j e c t LazyTrait extends App { t r a i t Worker [T] { v a l name : S t r i n g p r i n t l n ( s "$name I ’m i n i t i a l i z e d ! " ) // define working code in trait d e f work ( aWork : T ) : Unit } // value class - no new instance generated c a s e c l a s s C o o l S t r i n g ( param : S t r i n g ) extends AnyVal i m p l i c i t d e f l i f t 2 C o o l ( s r c : S t r i n g ) = C o o l S t r i n g ( s r c ) // "new" isn’t necessary here l a z y v a l lazyWorker = new { v a l name = " Laaazy "} with Worker [ C o o l S t r i n g ] { o v e r r i d e d e f work ( stringWork : C o o l S t r i n g ) { p r i n t l n ( s "Omg I ’ ve been c a l l e d ! ${ stringWork . param}" ) // method call in braces } } v a l eagerWorker = new { v a l name = " Eager ! "} with Worker [ S t r i n g ] { o v e r r i d e d e f work ( stringWork : S t r i n g ) { p r i n t l n ( s "Omg I ’ ve been c a l l e d ! $stringWork " ) } } eagerWorker . work ( "Work ’ o ’ h o l i c " ) lazyWorker . work ( C o o l S t r i n g ( " Laaaazy " ) ) // simple constructor calls via . apply() lazyWorker . work ( " I m p l i c i t l a a a a z y " ) // implicit conversion in place } Eugene Dzhurinsky Scala 7/14 github://jdevelop/sip
  12. Краткий обзор #Scala Познание глубины глубин Приборы и материалы. Вместо

    заключения. Имплиситы - наше все! package sample import s c a l a . a n n o t a t i o n . implicitNotFound o b j e c t M o r e I m p l i c i t s extends App { t r a i t mayAdd [T] { d e f +!( s r c : T ) : T } c a s e c l a s s myString ( param : S t r i n g ) extends mayAdd [ myString ] { o v e r r i d e d e f +!( s r c : myString ) = myString ( param + " : " + s r c . param ) } c a s e c l a s s myInt ( param : I n t ) extends mayAdd [ myInt ] { o v e r r i d e d e f +!( s r c : myInt ) = myInt ( param * s r c . param ) } i m p l i c i t d e f pimpString ( s t r : S t r i n g ) = myString ( s t r ) i m p l i c i t d e f pimpInt (num : I n t ) = myInt (num) p r i n t l n (1 +! 2 +! 3 ) ; p r i n t l n ( " aaa " +! "bbb" ) type strFunc = ( S t r i n g ) = > myString @implicitNotFound ( "You should make ( YourType ) = > myString a v a i l a b l e " ) d e f doSomethingWith ( s t r : S t r i n g ) ( i m p l i c i t f : strFunc ) = f ( s t r . r e v e r s e ) ; { i m p l i c i t d e f upperCase : strFunc = x = > myString ( x . toUpperCase ) p r i n t l n ( doSomethingWith ( " h e l l o world " ) . param ) } { i m p l i c i t d e f upperCase : strFunc = x = > myString ( x . c a p i t a l i z e ) p r i n t l n ( doSomethingWith ( " h e l l o world " ) . param ) } } Eugene Dzhurinsky Scala 8/14 github://jdevelop/sip
  13. Краткий обзор #Scala Познание глубины глубин Приборы и материалы. Вместо

    заключения. Тайпклассы - кто здесь? package sample o b j e c t T y p e c l a s s extends App{ t r a i t S e r i a l i z e [U] { d e f l o a d ( s r c : S t r i n g ) : U d e f save ( u : U) : S t r i n g } o b j e c t P r i n t e r { d e f p r i n t [U : S e r i a l i z e ] ( u : U) { p r i n t l n ( i m p l i c i t l y [ S e r i a l i z e [U ] ] . save ( u ) ) } } c a s e c l a s s User ( name : S t r i n g ) i m p l i c i t o b j e c t U s e r S e r i a l i z e r extends S e r i a l i z e [ User ] { o v e r r i d e d e f l o a d ( s r c : S t r i n g ) : User = User ( s r c ) o v e r r i d e d e f save ( u : User ) : S t r i n g = s " User name i s ${u . name}" } P r i n t e r . p r i n t ( User ( "John Doe" ) ) } Eugene Dzhurinsky Scala 9/14 github://jdevelop/sip
  14. Краткий обзор #Scala Познание глубины глубин Приборы и материалы. Вместо

    заключения. Функции высшего порядка package sample o b j e c t HighOrder extends App { c a s e c l a s s User ( p r i v a t e v a l name : S t r i n g ) { d e f p r i n t ( f : ( S t r i n g ) = > Unit ) { f ( name ) } } d e f putStr ( s : S t r i n g ) { p r i n t l n ( s ) } v a l u = User ( " Jane Doe" ) u . p r i n t ( putStr ) // pass a functional reference // pass an anonymous function u . p r i n t { c a s e x = > p r i n t l n ( x . toUpperCase ) } // another way to create a simple anonimous function u . p r i n t ( x = > p r i n t l n ( x . r e v e r s e ) ) } Eugene Dzhurinsky Scala 10/14 github://jdevelop/sip
  15. Краткий обзор #Scala Познание глубины глубин Приборы и материалы. Вместо

    заключения. Монады - это не больно! A monad is just a monoid in the category of endofunctors, what’s the problem? package sample o b j e c t Monadz extends App { //sealed trait Maybe[A] { - doesn’t work - need a variance here s e a l e d t r a i t Maybe[+A] { d e f map [B ] ( g : A = > B ) : Maybe [B] d e f flatMap [B ] ( g : A = > Maybe [B ] ) : Maybe [B] } c a s e c l a s s Just [+A] ( a : A) extends Maybe [A] { o v e r r i d e d e f map [B ] ( g : A = > B ) : Maybe [B] = Just ( g ( a ) ) o v e r r i d e d e f flatMap [B ] ( g : A = > Maybe [B ] ) = g ( a ) } c a s e o b j e c t None extends Maybe [ Nothing ] { o v e r r i d e d e f map [B ] ( g : Nothing = > B ) : Maybe [B] = None o v e r r i d e d e f flatMap [B ] ( g : Nothing = > Maybe [B ] ) = None } p r i n t l n ( f o r ( x <- Just ( "John" ) ; y <- Just ( "Doe" ) ) y i e l d ( x , y ) ) p r i n t l n ( f o r ( x <- Just ( "John" ) ; y <- None ) y i e l d ( x , y ) ) p r i n t l n ( f o r ( x <- None ; y <- Just ( " Anything e l s e " ) ) y i e l d ( x , y ) ) } Eugene Dzhurinsky Scala 11/14 github://jdevelop/sip
  16. Краткий обзор #Scala Познание глубины глубин Приборы и материалы. Вместо

    заключения. Познавательная литература Scala in depth by Joshua D Suereth. ISBN: 9781935182702 Programming in Scala by Martin Odersky. ISBN: 9780981531649 Haskell: the Craft of Functional Programming by Simon Thompson, ISBN: 0201882957 Real World Haskell by Bryan O’Sullivan, ISBN: 9780596514983 Eugene Dzhurinsky Scala 12/14 github://jdevelop/sip
  17. Краткий обзор #Scala Познание глубины глубин Приборы и материалы. Вместо

    заключения. Штуки Maven - http://maven.apache.org SBT - http://scala-sbt.org Intellij IDEA - http://www.jetbrains.com/idea/ Eugene Dzhurinsky Scala 13/14 github://jdevelop/sip
  18. Краткий обзор #Scala Познание глубины глубин Приборы и материалы. Вместо

    заключения. Традиционное Очень нужен программист для UI !!! Animatron.com Прямые руки Мозг Чувство прекрасного Java GWT TDD/BDD/ATDD/WTFDD Maven jobs@animatron.com Eugene Dzhurinsky Scala 14/14 github://jdevelop/sip