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

Groovy - The Superb Homeless - Michał Mally

Groovy - The Superb Homeless - Michał Mally

PJUG 03/03/2015

Tech Space guests

March 03, 2015
Tweet

More Decks by Tech Space guests

Other Decks in Technology

Transcript

  1. GROOVY KIND OF LOVE groove - a situation or an

    activity that one enjoys or to which one is especially well suited (found his groove playing bass in a trio). A very pleasurable experience; enjoy oneself (just sitting around, grooving on the music). To be affected with pleasurable excitement. To react or interact harmoniously.
  2. EVIDENCE #1: GRADLE a p p l y p l

    u g i n : ' j a v a ' s o u r c e C o m p a t i b i l i t y = 1 . 8 v e r s i o n = ' 1 . 0 ' j a r { m a n i f e s t { a t t r i b u t e s ' I m p l e m e n t a t i o n - T i t l e ' : ' G r a d l e Q u i c k s t a r t ' , ' I m p l e m e n t a t i o n - V e r s i o n ' : v e r s i o n } } r e p o s i t o r i e s { m a v e n C e n t r a l ( ) } d e p e n d e n c i e s { c o m p i l e g r o u p : ' c o m m o n s - c o l l e c t i o n s ' , n a m e : ' c o m m o n s - c o l l e c t i o n s ' , v e r s i o n : ' 3 . 2 ' t e s t C o m p i l e g r o u p : ' j u n i t ' , n a m e : ' j u n i t ' , v e r s i o n : ' 4 . + ' } u p l o a d A r c h i v e s { r e p o s i t o r i e s { f l a t D i r { d i r s ' r e p o s ' } } }
  3. EVIDENCE #2: GEB i m p o r t g

    e b . B r o w s e r B r o w s e r . d r i v e { g o " h t t p : / / m y a p p . c o m / l o g i n " a s s e r t $ ( " h 1 " ) . t e x t ( ) = = " P l e a s e L o g i n " $ ( " f o r m . l o g i n " ) . w i t h { u s e r n a m e = " a d m i n " p a s s w o r d = " p a s s w o r d " l o g i n ( ) . c l i c k ( ) } a s s e r t $ ( " h 1 " ) . t e x t ( ) = = " A d m i n S e c t i o n " }
  4. EVIDENCE #3: GRAILS c l a s s B o

    o k { s t a t i c b e l o n g s T o = A u t h o r s t a t i c h a s M a n y = [ a u t h o r s : A u t h o r ] S t r i n g t i t l e } c l a s s A u t h o r { s t a t i c h a s M a n y = [ b o o k s : B o o k ] S t r i n g n a m e } n e w B o o k ( n a m e : " G r o o v y i n A c t i o n " ) . a d d T o A u t h o r s ( n e w A u t h o r ( n a m e : " D i e r k K o e n i g " ) ) . a d d T o A u t h o r s ( n e w A u t h o r ( n a m e : " G u i l l a u m e L a f o r g e " ) ) . s a v e ( )
  5. EVIDENCE #4: SPOCK FRAMEWORK @ U n r o l

    l c l a s s D a t a D r i v e n S p e c e x t e n d s S p e c i f i c a t i o n { d e f " m i n i m u m o f # a a n d # b i s # c " ( ) { e x p e c t : M a t h . m i n ( a , b ) = = c w h e r e : a | b | | c 3 | 7 | | 3 5 | 4 | | 4 9 | 9 | | 9 } d e f " # p e r s o n . n a m e i s a # s e x . t o L o w e r C a s e ( ) p e r s o n " ( ) { e x p e c t : p e r s o n . g e t S e x ( ) = = s e x w h e r e : p e r s o n | | s e x n e w P e r s o n ( n a m e : " F r e d " ) | | " M a l e " n e w P e r s o n ( n a m e : " W i l m a " ) | | " F e m a l e " } s t a t i c c l a s s P e r s o n { S t r i n g n a m e S t r i n g g e t S e x ( ) { n a m e = = " F r e d " ? " M a l e " : " F e m a l e " } } }
  6. GROOVY... truly dynamic language running on JVM object-oriented (everything is

    an object) with functional traits eventually compiled language... and scripting language optionally typed language optional static type checking and compilation Java superset
  7. THESIS Groovy is an expressive, concise and JVM-based development- simplifying

    programming language. Groovy also provides seamless Java integration and flat learning curve for Java programmers.
  8. SIMPLE GREETER p u b l i c c l

    a s s S i m p l e G r e e t e r i m p l e m e n t s G r e e t e r { p r i v a t e S t r i n g g r e e t i n g ; @ O v e r r i d e p u b l i c v o i d s a y H e l l o ( S t r i n g n a m e ) { S t r i n g h e l l o M e s s a g e = p r e p a r e H e l l o M e s s a g e ( n a m e ) ; S y s t e m . o u t . p r i n t l n ( h e l l o M e s s a g e ) ; } p u b l i c S t r i n g g e t G r e e t i n g ( ) { r e t u r n g r e e t i n g ; } p u b l i c v o i d s e t G r e e t i n g ( S t r i n g g r e e t i n g ) { t h i s . g r e e t i n g = g r e e t i n g ; } p r i v a t e S t r i n g p r e p a r e H e l l o M e s s a g e ( S t r i n g n a m e ) { r e t u r n t h i s . g r e e t i n g + " " + n a m e . t o U p p e r C a s e ( ) + " ! " ; } } Java ~ 380 characters
  9. SIMPLER GREETER p u b l i c c l

    a s s S i m p l e G r e e t e r i m p l e m e n t s G r e e t e r { p r i v a t e S t r i n g g r e e t i n g ; @ O v e r r i d e p u b l i c v o i d s a y H e l l o ( S t r i n g n a m e ) { S t r i n g h e l l o M e s s a g e = p r e p a r e H e l l o M e s s a g e ( n a m e ) ; S y s t e m . o u t . p r i n t l n ( h e l l o M e s s a g e ) ; } p u b l i c S t r i n g g e t G r e e t i n g ( ) { r e t u r n g r e e t i n g ; } p u b l i c v o i d s e t G r e e t i n g ( S t r i n g g r e e t i n g ) { t h i s . g r e e t i n g = g r e e t i n g ; } p r i v a t e S t r i n g p r e p a r e H e l l o M e s s a g e ( S t r i n g n a m e ) { r e t u r n t h i s . g r e e t i n g + " " + n a m e . t o U p p e r C a s e ( ) + " ! " ; } } Java ~ 380 characters Groovy ~ 380 characters
  10. SIMPLER GREETER p u b l i c c l

    a s s S i m p l e G r e e t e r i m p l e m e n t s G r e e t e r { p r i v a t e S t r i n g g r e e t i n g @ O v e r r i d e p u b l i c v o i d s a y H e l l o ( S t r i n g n a m e ) { S t r i n g h e l l o M e s s a g e = p r e p a r e H e l l o M e s s a g e ( n a m e ) S y s t e m . o u t . p r i n t l n ( h e l l o M e s s a g e ) } p u b l i c S t r i n g g e t G r e e t i n g ( ) { r e t u r n g r e e t i n g } p u b l i c v o i d s e t G r e e t i n g ( S t r i n g g r e e t i n g ) { t h i s . g r e e t i n g = g r e e t i n g } p r i v a t e S t r i n g p r e p a r e H e l l o M e s s a g e ( S t r i n g n a m e ) { r e t u r n t h i s . g r e e t i n g + " " + n a m e . t o U p p e r C a s e ( ) + " ! " } } Java ~ 380 characters Groovy ~ 375 characters
  11. SIMPLER GREETER c l a s s S i m

    p l e G r e e t e r i m p l e m e n t s G r e e t e r { p r i v a t e S t r i n g g r e e t i n g @ O v e r r i d e v o i d s a y H e l l o ( S t r i n g n a m e ) { S t r i n g h e l l o M e s s a g e = p r e p a r e H e l l o M e s s a g e ( n a m e ) S y s t e m . o u t . p r i n t l n ( h e l l o M e s s a g e ) } S t r i n g g e t G r e e t i n g ( ) { r e t u r n g r e e t i n g } v o i d s e t G r e e t i n g ( S t r i n g g r e e t i n g ) { t h i s . g r e e t i n g = g r e e t i n g } p r i v a t e S t r i n g p r e p a r e H e l l o M e s s a g e ( S t r i n g n a m e ) { r e t u r n t h i s . g r e e t i n g + " " + n a m e . t o U p p e r C a s e ( ) + " ! " } } Java ~ 380 characters Groovy ~ 351 characters
  12. SIMPLER GREETER c l a s s S i m

    p l e G r e e t e r i m p l e m e n t s G r e e t e r { S t r i n g g r e e t i n g @ O v e r r i d e v o i d s a y H e l l o ( S t r i n g n a m e ) { S t r i n g h e l l o M e s s a g e = p r e p a r e H e l l o M e s s a g e ( n a m e ) S y s t e m . o u t . p r i n t l n ( h e l l o M e s s a g e ) } p r i v a t e S t r i n g p r e p a r e H e l l o M e s s a g e ( S t r i n g n a m e ) { r e t u r n t h i s . g r e e t i n g + " " + n a m e . t o U p p e r C a s e ( ) + " ! " } } Java ~ 380 characters Groovy ~ 254 characters
  13. SIMPLER GREETER c l a s s S i m

    p l e G r e e t e r i m p l e m e n t s G r e e t e r { S t r i n g g r e e t i n g @ O v e r r i d e v o i d s a y H e l l o ( S t r i n g n a m e ) { S t r i n g h e l l o M e s s a g e = p r e p a r e H e l l o M e s s a g e ( n a m e ) S y s t e m . o u t . p r i n t l n ( h e l l o M e s s a g e ) } p r i v a t e S t r i n g p r e p a r e H e l l o M e s s a g e ( S t r i n g n a m e ) { t h i s . g r e e t i n g + " " + n a m e . t o U p p e r C a s e ( ) + " ! " } } Java ~ 380 characters Groovy ~ 248 characters
  14. SIMPLER GREETER c l a s s S i m

    p l e G r e e t e r i m p l e m e n t s G r e e t e r { S t r i n g g r e e t i n g @ O v e r r i d e v o i d s a y H e l l o ( S t r i n g n a m e ) { S t r i n g h e l l o M e s s a g e = p r e p a r e H e l l o M e s s a g e ( n a m e ) p r i n t l n ( h e l l o M e s s a g e ) } p r i v a t e S t r i n g p r e p a r e H e l l o M e s s a g e ( S t r i n g n a m e ) { t h i s . g r e e t i n g + " " + n a m e . t o U p p e r C a s e ( ) + " ! " } } Java ~ 380 characters Groovy ~ 237 characters
  15. SIMPLER GREETER c l a s s S i m

    p l e G r e e t e r i m p l e m e n t s G r e e t e r { S t r i n g g r e e t i n g @ O v e r r i d e v o i d s a y H e l l o ( S t r i n g n a m e ) { S t r i n g h e l l o M e s s a g e = p r e p a r e H e l l o M e s s a g e ( n a m e ) p r i n t l n h e l l o M e s s a g e } p r i v a t e S t r i n g p r e p a r e H e l l o M e s s a g e ( S t r i n g n a m e ) { t h i s . g r e e t i n g + " " + n a m e . t o U p p e r C a s e ( ) + " ! " } } Java ~ 380 characters Groovy ~ 235 characters
  16. SIMPLER GREETER c l a s s S i m

    p l e G r e e t e r i m p l e m e n t s G r e e t e r { d e f g r e e t i n g @ O v e r r i d e v o i d s a y H e l l o ( S t r i n g n a m e ) { d e f h e l l o M e s s a g e = p r e p a r e H e l l o M e s s a g e ( n a m e ) p r i n t l n h e l l o M e s s a g e } p r i v a t e S t r i n g p r e p a r e H e l l o M e s s a g e ( S t r i n g n a m e ) { t h i s . g r e e t i n g + " " + n a m e . t o U p p e r C a s e ( ) + " ! " } } Java ~ 380 characters Groovy ~ 229 characters
  17. SIMPLER GREETER c l a s s S i m

    p l e G r e e t e r i m p l e m e n t s G r e e t e r { d e f g r e e t i n g @ O v e r r i d e v o i d s a y H e l l o ( S t r i n g n a m e ) { d e f h e l l o M e s s a g e = p r e p a r e H e l l o M e s s a g e ( n a m e ) p r i n t l n h e l l o M e s s a g e } p r i v a t e S t r i n g p r e p a r e H e l l o M e s s a g e ( S t r i n g n a m e ) { " $ { t h i s . g r e e t i n g } $ { n a m e . t o U p p e r C a s e ( ) } ! " } } Java ~ 380 characters Groovy ~ 230 characters
  18. SIMPLER GREETER c l a s s S i m

    p l e G r e e t e r i m p l e m e n t s G r e e t e r { d e f g r e e t i n g @ O v e r r i d e v o i d s a y H e l l o ( S t r i n g n a m e ) { d e f h e l l o M e s s a g e = p r e p a r e H e l l o M e s s a g e ( n a m e ) p r i n t l n h e l l o M e s s a g e } p r i v a t e S t r i n g p r e p a r e H e l l o M e s s a g e ( S t r i n g n a m e ) { " $ { t h i s . g r e e t i n g } $ { n a m e . t o U p p e r C a s e ( ) } ! " } } Java ~ 380 characters Groovy ~ 230 characters
  19. ASSERTIONS a s s e r t ( 2 +

    3 ) * 4 ! = ( 2 * 4 ) + ( 3 * 4 ) A s s e r t i o n f a i l e d : a s s e r t ( 2 + 3 ) * 4 ! = ( 2 * 4 ) + ( 3 * 4 ) | | | | | | 5 2 0 f a l s e 8 2 0 1 2 d e f n a m e = " G r o o v y " d e f s t a r t = 2 d e f e n d = 4 a s s e r t n a m e . s u b s t r i n g ( s t a r t , e n d ) = = n a m e [ s t a r t . . e n d ] A s s e r t i o n f a i l e d : a s s e r t n a m e . s u b s t r i n g ( s t a r t , e n d ) = = n a m e [ s t a r t . . e n d ] | | | | | | | | | | o o 2 4 | | | 2 4 G r o o v y | | o o v | G r o o v y f a l s e
  20. GROOVY TRUTH a s s e r t " G

    r o o v y " Truth is customizable!
  21. STRINGS d e f f i r s t N

    a m e = ' C o n n o r ' / / n o n - i n t e r p o l a t e d d e f l a s t N a m e = " O ' $ { f i r s t N a m e } " / / i n t e r p o l a t e d d e f q u e r y = " " " i n s e r t i n t o p e o p l e ( f i r s t N a m e , l a s t N a m e ) v a l u e s ( $ { f i r s t N a m e } , $ { l a s t N a m e } ) " " " / / m u l t i l i n e n e w S q l ( d a t a s o u r c e ) . e x e c u t e q u e r y / / a u t o m a t i c a l l y e s c a p e d REGULAR EXPRESSIONS S t r i n g l a n g u a g e s = / S c a l a G r o o v y J a v a B a s i c C o b o l P e r l C l o j u r e / P a t t e r n u t f l c = ~ / \ w + v \ w + / M a t c h e r m a t c h e r = ( l a n g u a g e s = ~ u t f l c ) p r i n t l n " " " C o o l l a n g u a g e s a r e $ { ( m a t c h e r a s L i s t ) . j o i n ( ' a n d ' ) } " " " C o o l l a n g u a g e s a r e G r o o v y a n d J a v a .
  22. RANGES a s s e r t 4 2 i

    n 1 . . 1 0 0 / / i n c l u s i v e i n t e g e r r a n g e ( ' a ' . . < ' d ' ) . e a c h { / / e x c l u s i v e S t r i n g r a n g e p r i n t l n i t } i m p o r t g r o o v y . t r a n s f o r m . I m m u t a b l e @ I m m u t a b l e c l a s s S e r i a l N u m b e r i m p l e m e n t s C o m p a r a b l e < S e r i a l N u m b e r > { i n t v a l u e @ O v e r r i d e i n t c o m p a r e T o ( S e r i a l N u m b e r o ) { v a l u e < = > o . v a l u e } S e r i a l N u m b e r n e x t ( ) { n e w S e r i a l N u m b e r ( v a l u e + 1 ) } S t r i n g t o S t r i n g ( ) { I n t e g e r . t o S t r i n g ( v a l u e , 3 6 ) . p a d L e f t ( 1 0 , ' 0 ' ) . t o U p p e r C a s e ( ) } } p r i n t l n n e w S e r i a l N u m b e r ( 1 0 2 2 2 ) . . n e w S e r i a l N u m b e r ( 1 0 2 2 5 ) [ 0 0 0 0 0 0 0 7 V Y , 0 0 0 0 0 0 0 7 V Z , 0 0 0 0 0 0 0 7 W 0 , 0 0 0 0 0 0 0 7 W 1 ]
  23. COLLECTIONS d e f n a m e s =

    [ g i r l s : [ ' G a b i ' , ' R a c h e l ' , ' O p h e l i a ' , ' O l g a ' , ' V i o l a ' , ' Y v e t t e ' ] , b o y s : [ ' G e r a r d ' , ' R o b e r t ' , ' O l i v e r ' , ' O l a f ' , ' V i n c e n t ' , ' Y o r k ' ] , ] n a m e s . e a c h { g e n d e r , n a m e L i s t - > p r i n t l n " $ { g e n d e r . c a p i t a l i z e ( ) } l o v e $ { n a m e L i s t * . g e t A t ( 0 ) . j o i n ( ' ' ) } " } G i r l s l o v e G R O O V Y B o y s l o v e G R O O V Y [] + RANGES a s s e r t [ 1 , 2 , 3 , 4 ] [ 0 ] = = 1 a s s e r t [ 1 , 2 , 3 , 4 ] [ 0 , 2 ] = = [ 1 , 3 ] a s s e r t [ 1 , 2 , 3 , 4 ] [ 0 . . 2 ] = = [ 1 , 2 , 3 ] a s s e r t [ 1 , 2 , 3 , 4 ] [ 1 . . - 2 ] = = [ 2 , 3 ] a s s e r t " G r o o v y " [ 0 ] = = " G " a s s e r t " G r o o v y " [ 3 . . - 1 ] = = " o v y "
  24. JAVA 8 LAMBDAS i m p o r t s

    t a t i c j a v a . u t i l . A r r a y s . a s L i s t ; p u b l i c c l a s s J a v a L a m b d a s { p u b l i c s t a t i c v o i d m a i n ( S t r i n g [ ] a r g s ) { a s L i s t ( 1 , 2 , 3 ) . s t r e a m ( ) . m a p ( i - > i * 2 ) . f i l t e r ( i - > i > 3 ) . f i n d F i r s t ( ) . o r E l s e T h r o w ( I l l e g a l A r g u m e n t E x c e p t i o n : : n e w ) ; } } GROOVY CLOSURES [ 1 , 2 , 3 ] . s t r e a m ( ) . m a p { i t * 2 } . f i l t e r { i t > 3 } . f i n d F i r s t ( ) . o r E l s e T h r o w ( I l l e g a l A r g u m e n t E x c e p t i o n . & n e w I n s t a n c e )
  25. CLOSURES ARE FIRST-CLASS CITIZENS B i n a r y

    O p e r a t o r < I n t e g e r > m u l t i p l y F u n c = { i n t a , i n t b - > a * b } C l o s u r e < I n t e g e r > m u l = { i n t a , i n t b - > a * b } CALLING CLOSURES m u l . c a l l ( 2 , 2 ) m u l ( 2 , 2 ) BIRTH CONTEXT d e f a n s w e r = 4 2 a s s e r t { - > a n s w e r } ( ) = = a n s w e r HIGHER-ORDER FUNCTIONS d e f b i n O p = { o p , a , b - > o p ( a , b ) } d e f m u l = b i n O p . c u r r y { a , b - > a * b } d e f m u l B y 4 = m u l . c u r r y ( 4 ) a s s e r t m u l B y 4 ( 2 ) = = m u l ( 4 , 2 ) a s s e r t m u l B y 4 ( 2 ) = = b i n O p ( { a , b - > a * b } , 4 , 2 )
  26. WORKING WITH CLOSURES d e f < T > T

    r e d u c e ( L i s t < T > c o l l e c t i o n , C l o s u r e < T > r e d u c e r ) { i f ( ! c o l l e c t i o n ) { r e t u r n n u l l } d e f a c c = c o l l e c t i o n . h e a d ( ) c o l l e c t i o n . t a i l ( ) . e a c h { e l - > a c c = r e d u c e r ( a c c , e l ) } a c c } CALLING CLOSURES r e d u c e ( [ ' G ' , ' r ' , ' o ' , ' o ' , ' v ' , ' y ' ] , { a , b - > a + b } ) r e d u c e ( [ ' G ' , ' r ' , ' o ' , ' o ' , ' v ' , ' y ' ] ) { a , b - > a + b }
  27. DUCK TYPING If it looks like a duck, swims like

    a duck, and quacks like a duck, then it probably is a duck. d e f r e d u c e ( c o l l e c t i o n , C l o s u r e r e d u c e r ) { i f ( ! c o l l e c t i o n ) { r e t u r n n u l l } d e f a c c = c o l l e c t i o n [ 0 ] c o l l e c t i o n [ 1 . . - 1 ] . e a c h { e l - > a c c = r e d u c e r ( a c c , e l ) } a c c } d e f r e d u c e r = { a , b - > b + a } p r i n t r e d u c e ( ' . 2 y v o o r G ' , r e d u c e r ) p r i n t r e d u c e ( [ 4 . 2 , - 6 . 9 , 6 . 8 ] , r e d u c e r ) G r o o v y 2 . 4 . 1
  28. INTO WORLD OF DSL m a i l { t

    o " g l a f o r g e @ g m a i l . c o m " , " c e d r i c . c h a m p e a u @ g m a i l . c o m " s u b j e c t " U R G E N T ! P L E A S E R E A D ! " b o d y " P l e a s e g u y s c o m e t o K r a k ó w ! " h e a d e r s s p a m : ' n o ' , i m p o r t a n t : t r u e } POSSIBLE? c l a s s M a i l C o m p o s e r { v o i d t o ( S t r i n g . . . a d d r e s s e s ) { p r i n t l n " t o : $ a d d r e s s e s " } v o i d s u b j e c t ( S t r i n g s u b j e c t ) { p r i n t l n " s u b j e c t : $ s u b j e c t " } v o i d b o d y ( S t r i n g b o d y ) { p r i n t l n " b o d y : $ b o d y " } v o i d h e a d e r s ( M a p h e a d e r s ) { p r i n t l n " h e a d e r s : $ h e a d e r s " } } v o i d m a i l ( @ D e l e g a t e s T o ( M a i l C o m p o s e r ) C l o s u r e c o m p o s e r ) { / / s a m e a s : / / n e w M a i l C o m p o s e r ( ) . w i t h ( c o m p o s e r ) C l o s u r e c l = c o m p o s e r . c l o n e ( ) c l . d e l e g a t e = n e w M a i l C o m p o s e r ( ) c l . r e s o l v e S t r a t e g y = C l o s u r e . D E L E G A T E _ F I R S T c l ( ) }
  29. PROPERTY MISSING d e f w i s e a

    c r e = n e w I K n o w A l l P r o p e r t i e s ( ) w i s e a c r e . d o Y o u = ' Y e s , I d o ! ' a s s e r t w i s e a c r e . d o Y o u = = ' Y e s , I d o ! ' POSSIBLE? c l a s s I K n o w A l l P r o p e r t i e s { d e f p r o p s = [ : ] / / s e t t i n g p r o p e r t y v a l u e d e f p r o p e r t y M i s s i n g ( S t r i n g n a m e , v a l u e ) { p r o p s [ n a m e ] = v a l u e } / / r e a d i n g p r o p e r t y v a l u e d e f p r o p e r t y M i s s i n g ( S t r i n g n a m e ) { p r o p s [ n a m e ] } }
  30. METHOD MISSING d e f m a g a z

    i n e = n e w M a g a z i n e ( ) p r i n t l n " B a l l s m a d e b y N i k e : " + m a g a z i n e . f i n d B y M a k e ( ' N i k e ' ) p r i n t l n " B a l l s m a d e i n 2 0 1 3 : " + m a g a z i n e . f i n d B y Y e a r ( 2 0 1 3 ) POSSIBLE? c l a s s M a g a z i n e { p r i v a t e b a l l s = [ [ M a k e : ' A d i d a s ' , S i z e : 5 , C o l o r : ' b l a c k ' , Y e a r : 2 0 1 3 ] , [ M a k e : ' N i k e ' , S i z e : 5 , C o l o r : ' w h i t e ' ] ] d e f m e t h o d M i s s i n g ( S t r i n g n a m e , a r g s ) { i f ( ! n a m e . s t a r t s W i t h ( ' f i n d B y ' ) | | a r g s . s i z e ( ) ! = 1 ) { t h r o w n e w M i s s i n g M e t h o d E x c e p t i o n ( n a m e , M a g a z i n e , a r g s ) } d e f p r o p = n a m e - ' f i n d B y ' b a l l s . f i n d A l l { b a l l - > b a l l [ p r o p ] = = a r g s [ 0 ] } } } 10m ~ 11.84s
  31. INTERCEPT, CACHE AND INVOKE c l a s s M

    a g a z i n e { p r i v a t e b a l l s = [ [ M a k e : ' A d i d a s ' , S i z e : 5 , C o l o r : ' b l a c k ' , Y e a r : 2 0 1 3 ] , [ M a k e : ' N i k e ' , S i z e : 5 , C o l o r : ' w h i t e ' ] ] d e f m e t h o d M i s s i n g ( S t r i n g n a m e , a r g s ) { / / I N T E R C E P T i f ( ! n a m e . s t a r t s W i t h ( ' f i n d B y ' ) | | a r g s . s i z e ( ) ! = 1 ) { t h r o w n e w M i s s i n g M e t h o d E x c e p t i o n ( n a m e , M a g a z i n e , a r g s ) } / / C A C H E d e f p r o p = n a m e - ' f i n d B y ' d e f n e w M e t h o d = { l o o k e d U p V a l u e - > b a l l s . f i n d A l l { b a l l - > b a l l [ p r o p ] = = l o o k e d U p V a l u e } } n e w M e t h o d . r e s o l v e S t r a t e g y = C l o s u r e . D E L E G A T E _ F I R S T M a g a z i n e . m e t a C l a s s . " $ n a m e " = n e w M e t h o d / / I N V O K E n e w M e t h o d ( a r g s [ 0 ] ) } } 10m ~ 6.63s (44% faster)
  32. JSON BUILDER i m p o r t g r

    o o v y . j s o n . J s o n B u i l d e r d e f b u i l d e r = n e w J s o n B u i l d e r ( ) b u i l d e r . p e o p l e { p e r s o n { f i r s t N a m e ' G u i l l a m e ' l a s t N a m e ' L a f o r g e ' a d d r e s s ( c i t y : ' P a r i s ' , c o u n t r y : ' F r a n c e ' , z i p : 1 2 3 4 5 , ) m a r r i e d t r u e c o n f e r e n c e s ( ' J a v a O n e ' , ' G r 8 c o n f ' ) } } { " p e o p l e " : { " p e r s o n " : { " f i r s t N a m e " : " G u i l l a m e " , " l a s t N a m e " : " L a f o r g e " , " a d d r e s s " : { " c i t y " : " P a r i s " , " c o u n t r y " : " F r a n c e " , " z i p " : 1 2 3 4 5 } , " m a r r i e d " : t r u e , " c o n f e r e n c e s " : [ " J a v a O n e " , " G r 8 c o n f " ] } } } b u i l d e r . t o P r e t t y S t r i n g ( )
  33. DYNAMIC BUILDERS i m p o r t j a

    v a . u t i l . c o n c u r r e n t . T h r e a d L o c a l R a n d o m i m p o r t s t a t i c T h r e a d L o c a l R a n d o m . c u r r e n t a s r a n d o m d e f m a k e s = [ ' H o n d a ' , ' S u z u k i ' , ' Y a m a h a ' ] d e f b u i l d e r = n e w g r o o v y . j s o n . J s o n B u i l d e r ( ) b u i l d e r . b i k e s { 4 . t i m e s { d e f p l a t e = r a n d o m ( ) . n e x t I n t ( 1 0 0 _ 0 0 0 ) . t o S t r i n g ( ) . p a d L e f t ( 5 , ' 0 ' ) " K R $ p l a t e " ( m a k e : m a k e s [ r a n d o m ( ) . n e x t I n t ( m a k e s . s i z e ( ) ) ] , y e a r : r a n d o m ( ) . n e x t I n t ( 2 0 0 0 , 2 0 1 5 ) ) } } p r i n t l n b u i l d e r . t o P r e t t y S t r i n g ( )
  34. DYNAMIC BUILDERS CONT. { " b i k e s

    " : { " K R 1 5 5 9 8 " : { " m a k e " : " S u z u k i " , " y e a r " : 2 0 1 2 } , " K R 6 5 5 7 4 " : { " m a k e " : " H o n d a " , " y e a r " : 2 0 1 1 } , " K R 9 6 3 1 9 " : { " m a k e " : " Y a m a h a " , " y e a r " : 2 0 0 2 } , " K R 0 9 9 8 5 " : { " m a k e " : " H o n d a " , " y e a r " : 2 0 0 1 } } }
  35. ABSTRACT SYNTAX TREE t r a n s f o

    r m : : A S T - > A S T
  36. VERSION EXAMPLE i m p o r t g r

    o o v y . t r a n s f o r m . * @ I m m u t a b l e @ T o S t r i n g @ E q u a l s A n d H a s h C o d e @ S o r t a b l e c l a s s V e r s i o n { i n t m a j o r i n t m i n o r i n t b u i l d } a s s e r t n e w V e r s i o n ( 2 , 4 , 1 ) . m a j o r = = 2 / / n e w V e r s i o n ( 2 , 4 , 1 ) . m a j o r = 3 a s s e r t n e w V e r s i o n ( 2 , 4 , 1 ) = = n e w V e r s i o n ( m a j o r : 2 , m i n o r : 4 , b u i l d : 1 ) a s s e r t n e w V e r s i o n ( 2 , 4 , 1 ) > n e w V e r s i o n ( 2 , 4 , 0 ) a s s e r t n e w V e r s i o n ( 2 , 4 , 1 ) . t o S t r i n g ( ) = = " V e r s i o n ( 2 , 4 , 1 ) "
  37. @Lazy c l a s s L o o k

    u p { @ L a z y p r i v a t e r e s o u r c e = n e w O b j e c t ( ) { { p r i n t l n " C r e a t i n g e x p e n s i v e r e s o u r c e ! " } } L o o k u p ( ) { p r i n t l n " C r e a t i n g L o o k u p . " } d e f l o o k u p ( ) { p r i n t l n " L o o k i n g u p r e s o u r c e . . . " r e s o u r c e } } d e f l o o k u p = n e w L o o k u p ( ) l o o k u p . l o o k u p ( ) C r e a t i n g L o o k u p . L o o k i n g u p r e s o u r c e . . . C r e a t i n g e x p e n s i v e r e s o u r c e !
  38. @Memoized i m p o r t g r o

    o v y . t r a n s f o r m . M e m o i z e d c l a s s F i b o n a c c i { @ M e m o i z e d s t a t i c l o n g f i b ( l o n g n ) { i f ( n < 2 ) { r e t u r n 1 } f i b ( n - 1 ) + f i b ( n - 2 ) } } p r i n t l n F i b o n a c c i . f i b ( 5 0 ) Without @Memoized ~ 3m With @Memoized ~ 5ms
  39. @TailRecursive i m p o r t g r o

    o v y . t r a n s f o r m . T a i l R e c u r s i v e c l a s s F a c t o r i a l { @ T a i l R e c u r s i v e s t a t i c B i g I n t e g e r f a c t ( l o n g n , B i g I n t e g e r a c c = 1 . t o B i g I n t e g e r ( ) ) { i f ( n = = 0 ) { r e t u r n a c c } f a c t ( n - 1 , a c c . m u l t i p l y ( n . t o B i g I n t e g e r ( ) ) ) } } p r i n t l n F a c t o r i a l . f a c t ( 2 0 _ 0 0 0 ) j a v a . l a n g . S t a c k O v e r f l o w E r r o r a t F a c t o r i a l . f a c t ( C o n s o l e S c r i p t 1 : 1 0 ) a t F a c t o r i a l $ f a c t . c a l l S t a t i c ( U n k n o w n S o u r c e ) a t F a c t o r i a l . f a c t ( C o n s o l e S c r i p t 1 : 1 0 ) a t F a c t o r i a l $ f a c t . c a l l S t a t i c ( U n k n o w n S o u r c e ) a t F a c t o r i a l . f a c t ( C o n s o l e S c r i p t 1 : 1 0 ) a t F a c t o r i a l $ f a c t . c a l l S t a t i c ( U n k n o w n S o u r c e ) ( . . . )