Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Scala overview

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.

Scala overview

Avatar for Eugene Dzhurinsky

Eugene Dzhurinsky

August 18, 2014
Tweet

Other Decks in Education

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 [email protected] Eugene Dzhurinsky Scala 14/14 github://jdevelop/sip