SlideShare une entreprise Scribd logo
1  sur  34
Télécharger pour lire hors ligne
for                      Developers
                          by  Leonard  Axelsson  (@xlson)




                                                                1

Thursday, June 17, 2010
SweGUG

                          Leonard Axelsson
        • Groovy user since 2006
        • Co-Founder of SweGUG
              –Swedish Groovy User Group
        • Speaker at GTUG, Agical Geeknight, JFokus,
          SweGUG
        • Developer/Consultant at Qbranch Stockholm




                                                       2

Thursday, June 17, 2010
SweGUG

                           Agenda
        • Overview and obligatory Hello World
        • Syntax Overview
        • Tips and Trix




                                                3

Thursday, June 17, 2010
SweGUG

                          Groovy Overview
        • Originated in 2003
        • Under the Apache License
        • Grammar derived from Java 1.5




                                            4

Thursday, June 17, 2010
SweGUG

                          Groovy Overview
        • Dynamic language
              –Inspired by Python, Ruby and Smalltalk
        • Object Oriented
        • Easy to learn for Java devs
              –Supports Java style code out of the box
        • Scriptable
        • Embeddable


                                                         5

Thursday, June 17, 2010
SweGUG

                                   Dynamic Language
        • No compile-time checking
              – int i = “Hello”                  throws exception at runtime
        • Ducktyping
              – def keyword allows you to care about what the object
                 does, not what it is
        • Supports custom DSLs
        new  DateDSL().last.day.in.december(  2009  )




                                                                               6

Thursday, June 17, 2010
SweGUG

                                  Gotchas
        • == uses equals()
              –not object identity
              –is() used for identity comparission
        • return keyword is optional
        • Methods and classes are public by default
        • All exceptions are unchecked exceptions
        • There are no primitives


                                                      7

Thursday, June 17, 2010
SweGUG




                          The obligatory Hello World




                                                       8

Thursday, June 17, 2010
SweGUG




             How many in here know Groovy?




                                             9

Thursday, June 17, 2010
SweGUG




                  Groovy can be coded the “Java”
                    way. So basically all of you!




                                                    10

Thursday, June 17, 2010
SweGUG

                                 HelloWorld.java

        class HelloWorld {
            public static void main(String[] args) {
                System.out.println("Hello World!");
            }
        }




                                                       11

Thursday, June 17, 2010
SweGUG

                             HelloWorld.groovy

        class HelloWorld {
            public static void main(String[] args) {
                System.out.println("Hello World!");
            }
        }




                                                       12

Thursday, June 17, 2010
SweGUG

                                      Removing ...

        class HelloWorld {
            public static void main(String[] args) {
                System.out.println("Hello World!");
            }
        }




                                                       13

Thursday, June 17, 2010
SweGUG

                                      Removing ...

        class HelloWorld {
            public static void main(String[] args) {
                System.out.println("Hello World!")
            }
        }




                                                       14

Thursday, June 17, 2010
SweGUG

                                      Removing ...

        class HelloWorld {
            public static void main(String[] args) {
                println("Hello World!")
            }
        }




                                                       15

Thursday, June 17, 2010
SweGUG

                                  Removing ...

        println("Hello World!")




                                                 16

Thursday, June 17, 2010
SweGUG

                                 This is it

        println "Hello World!"




                                              17

Thursday, June 17, 2010
SweGUG

                          Feature Overview
        • Properties
              –dynamic getters and setters
        • Closures
              –reusable blocks of code
        • Meta Object Protocol
              –rewrite behaviour at runtime
        • Many additions to the JDK



                                              18

Thursday, June 17, 2010
SweGUG

                          Default imports
        • java.io.*
        • java.lang.*
        • java.math.BigDecimal
        • java.math.BigInteger
        • java.net.*
        • java.util.*
        • groovy.lang.*
        • groovy.util.*

                                            19

Thursday, June 17, 2010
SweGUG




                          Strings




                                    20

Thursday, June 17, 2010
SweGUG

                                 Remember this?

        println "Hello World!"




                                                  21

Thursday, June 17, 2010
SweGUG

                          Let’s add something ...
        • Macros supported in double-quoted strings
        String whome = "World!"

        println "Hello $whome"




        Output:
        Hello World!




                                                      22

Thursday, June 17, 2010
SweGUG




                          Plain Old Groovy Objects




                                                     23

Thursday, June 17, 2010
SweGUG

                                           POGO’s
        • Properties
              –getters and setters are created automatically
        • Named Parameters
              –clarifies intent
        class Person {
            String name
            String lastname
        }

        def anders = new Person(name: 'Anders', lastname: 'Andersson')
        assert anders.getName() == 'Anders'

        // Anders gets married and changes his lastname
        anders.setLastname("Sundstedt")
        assert anders.lastname == "Sundstedt"




                                                                         24

Thursday, June 17, 2010
SweGUG

                                             POGO’s
        • Getters and setters can be overridden
        class Person {
            def name
            def lastname

              String setLastname(String lastname) {
                  this.lastname = lastname.reverse()
              }
        }

        def anders = new Person(name: 'Anders', lastname: 'Andersson')

        // Anders does a strange change of his lastname
        anders.lastname = "Sundstedt"
        assert anders.lastname == "tdetsdnuS"




                                                                         25

Thursday, June 17, 2010
SweGUG




                 Built in syntax for lists and maps




                                                      26

Thursday, June 17, 2010
SweGUG

                                                Lists
        List  syntax:
        def names = ['Leonard', 'Anna', 'Anders']
        assert names instanceof List
        assert names.size() == 3
        assert names[0] == 'Leonard'




                                                        27

Thursday, June 17, 2010
SweGUG

                                                 Maps

        def map = [name: 'Leonard',
                   lastname: 'Axelsson']
        assert map.name == 'Leonard'
        assert map['lastname'] == 'Axelsson'

        map.each{ key, value ->
            println "Key: $key, Value: $value"
        }

        Output:
        Key: name, Value: Leonard
        Key: lastname, Value: Axelsson




                                                        28

Thursday, June 17, 2010
SweGUG

                              each, find and findAll

        class Person {
            String name
            String lastname
            boolean male
        }

        def ages = [new Person(name: 'Bo', lastname: 'Olsson', male: true),
                    new Person(name: 'Gunn', lastname: 'Bertilsson', male: false),
                    new Person(name: 'Britt', lastname: 'Olsson', male: false)]
        // Print all names
        ages.each { println "$it.name $it.lastname" }

        // Find one male
        assert ages.find{ person -> person.male }.name == 'Bo'

        // or find all females
        assert ages.findAll{ Person p -> !p.male }.size() == 2




                                                                                     29

Thursday, June 17, 2010
SweGUG

                                               Power Asserts
        • New in Groovy 1.7
        // Will throw an assertion error
        def getNum() { 5 }
        assert (1 + 100) == num + 77

        Output:
        Assertion failed:

        assert (1 + 100) == num + 77
                  |      |  |   |
                  101    |  5   82
                         false

        	     at org.codehaus.groovy.runtime.InvokerHelper.assertFailed(InvokerHelper.java:378)
        	     at ...




                                                                                                  30

Thursday, June 17, 2010
SweGUG

                                      Method not found?
        • Better feedback in Groovy 1.7
        // Will throw a MissingMethodException (no beginsWith method)
        def carType = "BMW M3"
        if(carType.beginsWith('Volvo')) {
            println "It's a Volvo!"
        }

        Output:
        groovy.lang.MissingMethodException: No signature of method: java.lang.String.beginsWith() is applicable for argument types:
        (java.lang.String) values: [Volvo]
        Possible solutions: endsWith(java.lang.String), startsWith(java.lang.String)
        	    at ...




                                                                                                                                      31

Thursday, June 17, 2010
SweGUG

                          @Grab and grape
        • Dependency management using Apache Ivy
              –Uses Maven Central
        • grape commandline tool
              –Adds dependencies to Groovys global classpath
        • @Grab annotation
              –Great for scripting




                                                               32

Thursday, June 17, 2010
SweGUG

                                     @Grab and GPars
        @Grab(group='org.codehaus.gpars', module='gpars', version='0.10')
        import groovyx.gpars.GParsExecutorsPool

        def importProcessingData = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 ,18, 19, 20]

        time('Parallel execution') {
            GParsExecutorsPool.withPool {
                importProcessingData.eachParallel { data ->
                    // Insert arbitrary heavy operation here
                    sleep 200
                }

             }
        }

        time('Linear execution') {
            importProcessingData.each {
                // Insert arbitrary heavy operation here
                sleep 200
            }
        }
        Output  (executed  on  dual-­‐core  machine):
        Parallel execution desc, 1449 ms.{
        def time(String took: task)
        Linear execution took: 4006 Date().time
             def startTime = new ms.
             def result = task()
             def executionTime = new Date().time - startTime
             println "$desc took: $executionTime ms."
             result
        }

                                                                                                             33

Thursday, June 17, 2010
SweGUG

                                    Links
        • Groovy
              –http://groovy.codehaus.org/
        • Groovy Goodness (great tips and trix)
              –http://mrhaki.blogspot.com/
        • SweGUG
              –http://groups.google.com/group/swegug




                                                       34

Thursday, June 17, 2010

Contenu connexe

En vedette

peoples' chjoice
peoples' chjoicepeoples' chjoice
peoples' chjoicechuckbowers
 
Supply Chain Partners
Supply Chain PartnersSupply Chain Partners
Supply Chain PartnersJonGrigg
 
Presentazione ubiquitous computing - Scrittura e tecnologia - 10 dicembre 201...
Presentazione ubiquitous computing - Scrittura e tecnologia - 10 dicembre 201...Presentazione ubiquitous computing - Scrittura e tecnologia - 10 dicembre 201...
Presentazione ubiquitous computing - Scrittura e tecnologia - 10 dicembre 201...Giuseppe Benevento
 
Peoples Choice Ultimate
Peoples Choice UltimatePeoples Choice Ultimate
Peoples Choice Ultimatechuckbowers
 
Planning System
Planning SystemPlanning System
Planning SystemJonGrigg
 
Language Teaching and learning in the Web 2.0 Environment
Language Teaching and learning in the Web 2.0 EnvironmentLanguage Teaching and learning in the Web 2.0 Environment
Language Teaching and learning in the Web 2.0 EnvironmentYuka Matsuhashi
 

En vedette (7)

peoples' chjoice
peoples' chjoicepeoples' chjoice
peoples' chjoice
 
Supply Chain Partners
Supply Chain PartnersSupply Chain Partners
Supply Chain Partners
 
Heart Attack13 6
Heart Attack13 6Heart Attack13 6
Heart Attack13 6
 
Presentazione ubiquitous computing - Scrittura e tecnologia - 10 dicembre 201...
Presentazione ubiquitous computing - Scrittura e tecnologia - 10 dicembre 201...Presentazione ubiquitous computing - Scrittura e tecnologia - 10 dicembre 201...
Presentazione ubiquitous computing - Scrittura e tecnologia - 10 dicembre 201...
 
Peoples Choice Ultimate
Peoples Choice UltimatePeoples Choice Ultimate
Peoples Choice Ultimate
 
Planning System
Planning SystemPlanning System
Planning System
 
Language Teaching and learning in the Web 2.0 Environment
Language Teaching and learning in the Web 2.0 EnvironmentLanguage Teaching and learning in the Web 2.0 Environment
Language Teaching and learning in the Web 2.0 Environment
 

Similaire à Groovy Introduction at Javaforum 2010

Groovy to infinity and beyond - SpringOne2GX - 2010 - Guillaume Laforge
Groovy to infinity and beyond - SpringOne2GX - 2010 - Guillaume LaforgeGroovy to infinity and beyond - SpringOne2GX - 2010 - Guillaume Laforge
Groovy to infinity and beyond - SpringOne2GX - 2010 - Guillaume LaforgeGuillaume Laforge
 
Migrating existing Projects to Wonder
Migrating existing Projects to WonderMigrating existing Projects to Wonder
Migrating existing Projects to WonderWO Community
 
Groovy 1 7 Update, past, present, future - S2G Forum 2010
Groovy 1 7 Update, past, present, future - S2G Forum 2010Groovy 1 7 Update, past, present, future - S2G Forum 2010
Groovy 1 7 Update, past, present, future - S2G Forum 2010Guillaume Laforge
 
Node.js - JavaScript Chicago Meetup
Node.js - JavaScript Chicago MeetupNode.js - JavaScript Chicago Meetup
Node.js - JavaScript Chicago Meetuphugs
 
Unobtrusive CSS
Unobtrusive CSSUnobtrusive CSS
Unobtrusive CSSJohn Hwang
 
Jython 2.7 and techniques for integrating with Java - Frank Wierzbicki
Jython 2.7 and techniques for integrating with Java - Frank WierzbickiJython 2.7 and techniques for integrating with Java - Frank Wierzbicki
Jython 2.7 and techniques for integrating with Java - Frank Wierzbickifwierzbicki
 
Oscon Java Testing on the Fast Lane
Oscon Java Testing on the Fast LaneOscon Java Testing on the Fast Lane
Oscon Java Testing on the Fast LaneAndres Almiray
 
Adopt OpenJDK presentation (slide deck)
Adopt OpenJDK presentation (slide deck)Adopt OpenJDK presentation (slide deck)
Adopt OpenJDK presentation (slide deck)Mani Sarkar
 
Getting your Grails on
Getting your Grails onGetting your Grails on
Getting your Grails onTom Henricksen
 
Groovy Metaprogramming for Dummies
Groovy Metaprogramming for DummiesGroovy Metaprogramming for Dummies
Groovy Metaprogramming for DummiesDarren Cruse
 

Similaire à Groovy Introduction at Javaforum 2010 (16)

Základy GWT
Základy GWTZáklady GWT
Základy GWT
 
Groovy to infinity and beyond - SpringOne2GX - 2010 - Guillaume Laforge
Groovy to infinity and beyond - SpringOne2GX - 2010 - Guillaume LaforgeGroovy to infinity and beyond - SpringOne2GX - 2010 - Guillaume Laforge
Groovy to infinity and beyond - SpringOne2GX - 2010 - Guillaume Laforge
 
Migrating existing Projects to Wonder
Migrating existing Projects to WonderMigrating existing Projects to Wonder
Migrating existing Projects to Wonder
 
Groovy 1 7 Update, past, present, future - S2G Forum 2010
Groovy 1 7 Update, past, present, future - S2G Forum 2010Groovy 1 7 Update, past, present, future - S2G Forum 2010
Groovy 1 7 Update, past, present, future - S2G Forum 2010
 
Node.js - JavaScript Chicago Meetup
Node.js - JavaScript Chicago MeetupNode.js - JavaScript Chicago Meetup
Node.js - JavaScript Chicago Meetup
 
Rejectkaigi 2010
Rejectkaigi 2010Rejectkaigi 2010
Rejectkaigi 2010
 
Tomas Grails
Tomas GrailsTomas Grails
Tomas Grails
 
Unobtrusive CSS
Unobtrusive CSSUnobtrusive CSS
Unobtrusive CSS
 
Is these a bug
Is these a bugIs these a bug
Is these a bug
 
Groovyの紹介20110820
Groovyの紹介20110820Groovyの紹介20110820
Groovyの紹介20110820
 
Jython 2.7 and techniques for integrating with Java - Frank Wierzbicki
Jython 2.7 and techniques for integrating with Java - Frank WierzbickiJython 2.7 and techniques for integrating with Java - Frank Wierzbicki
Jython 2.7 and techniques for integrating with Java - Frank Wierzbicki
 
Oscon Java Testing on the Fast Lane
Oscon Java Testing on the Fast LaneOscon Java Testing on the Fast Lane
Oscon Java Testing on the Fast Lane
 
Adopt OpenJDK presentation (slide deck)
Adopt OpenJDK presentation (slide deck)Adopt OpenJDK presentation (slide deck)
Adopt OpenJDK presentation (slide deck)
 
Groovy MOPping
Groovy MOPpingGroovy MOPping
Groovy MOPping
 
Getting your Grails on
Getting your Grails onGetting your Grails on
Getting your Grails on
 
Groovy Metaprogramming for Dummies
Groovy Metaprogramming for DummiesGroovy Metaprogramming for Dummies
Groovy Metaprogramming for Dummies
 

Dernier

Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j
 
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationBeyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationSafe Software
 
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticscarlostorres15106
 
Pigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions
 
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024BookNet Canada
 
Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machinePadma Pradeep
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking MenDelhi Call girls
 
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | DelhiFULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhisoniya singh
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationRadu Cotescu
 
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...HostedbyConfluent
 
Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Paola De la Torre
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsEnterprise Knowledge
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxKatpro Technologies
 
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Patryk Bandurski
 
Benefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other FrameworksBenefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other FrameworksSoftradix Technologies
 
Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...Alan Dix
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountPuma Security, LLC
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonetsnaman860154
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationSafe Software
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationMichael W. Hawkins
 

Dernier (20)

Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
 
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationBeyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
 
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
 
Pigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food Manufacturing
 
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
 
Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machine
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
 
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | DelhiFULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
 
Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
 
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
 
Benefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other FrameworksBenefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other Frameworks
 
Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path Mount
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 

Groovy Introduction at Javaforum 2010

  • 1. for Developers by  Leonard  Axelsson  (@xlson) 1 Thursday, June 17, 2010
  • 2. SweGUG Leonard Axelsson • Groovy user since 2006 • Co-Founder of SweGUG –Swedish Groovy User Group • Speaker at GTUG, Agical Geeknight, JFokus, SweGUG • Developer/Consultant at Qbranch Stockholm 2 Thursday, June 17, 2010
  • 3. SweGUG Agenda • Overview and obligatory Hello World • Syntax Overview • Tips and Trix 3 Thursday, June 17, 2010
  • 4. SweGUG Groovy Overview • Originated in 2003 • Under the Apache License • Grammar derived from Java 1.5 4 Thursday, June 17, 2010
  • 5. SweGUG Groovy Overview • Dynamic language –Inspired by Python, Ruby and Smalltalk • Object Oriented • Easy to learn for Java devs –Supports Java style code out of the box • Scriptable • Embeddable 5 Thursday, June 17, 2010
  • 6. SweGUG Dynamic Language • No compile-time checking – int i = “Hello” throws exception at runtime • Ducktyping – def keyword allows you to care about what the object does, not what it is • Supports custom DSLs new  DateDSL().last.day.in.december(  2009  ) 6 Thursday, June 17, 2010
  • 7. SweGUG Gotchas • == uses equals() –not object identity –is() used for identity comparission • return keyword is optional • Methods and classes are public by default • All exceptions are unchecked exceptions • There are no primitives 7 Thursday, June 17, 2010
  • 8. SweGUG The obligatory Hello World 8 Thursday, June 17, 2010
  • 9. SweGUG How many in here know Groovy? 9 Thursday, June 17, 2010
  • 10. SweGUG Groovy can be coded the “Java” way. So basically all of you! 10 Thursday, June 17, 2010
  • 11. SweGUG HelloWorld.java class HelloWorld { public static void main(String[] args) { System.out.println("Hello World!"); } } 11 Thursday, June 17, 2010
  • 12. SweGUG HelloWorld.groovy class HelloWorld { public static void main(String[] args) { System.out.println("Hello World!"); } } 12 Thursday, June 17, 2010
  • 13. SweGUG Removing ... class HelloWorld { public static void main(String[] args) { System.out.println("Hello World!"); } } 13 Thursday, June 17, 2010
  • 14. SweGUG Removing ... class HelloWorld { public static void main(String[] args) { System.out.println("Hello World!") } } 14 Thursday, June 17, 2010
  • 15. SweGUG Removing ... class HelloWorld { public static void main(String[] args) { println("Hello World!") } } 15 Thursday, June 17, 2010
  • 16. SweGUG Removing ... println("Hello World!") 16 Thursday, June 17, 2010
  • 17. SweGUG This is it println "Hello World!" 17 Thursday, June 17, 2010
  • 18. SweGUG Feature Overview • Properties –dynamic getters and setters • Closures –reusable blocks of code • Meta Object Protocol –rewrite behaviour at runtime • Many additions to the JDK 18 Thursday, June 17, 2010
  • 19. SweGUG Default imports • java.io.* • java.lang.* • java.math.BigDecimal • java.math.BigInteger • java.net.* • java.util.* • groovy.lang.* • groovy.util.* 19 Thursday, June 17, 2010
  • 20. SweGUG Strings 20 Thursday, June 17, 2010
  • 21. SweGUG Remember this? println "Hello World!" 21 Thursday, June 17, 2010
  • 22. SweGUG Let’s add something ... • Macros supported in double-quoted strings String whome = "World!" println "Hello $whome" Output: Hello World! 22 Thursday, June 17, 2010
  • 23. SweGUG Plain Old Groovy Objects 23 Thursday, June 17, 2010
  • 24. SweGUG POGO’s • Properties –getters and setters are created automatically • Named Parameters –clarifies intent class Person { String name String lastname } def anders = new Person(name: 'Anders', lastname: 'Andersson') assert anders.getName() == 'Anders' // Anders gets married and changes his lastname anders.setLastname("Sundstedt") assert anders.lastname == "Sundstedt" 24 Thursday, June 17, 2010
  • 25. SweGUG POGO’s • Getters and setters can be overridden class Person { def name def lastname String setLastname(String lastname) { this.lastname = lastname.reverse() } } def anders = new Person(name: 'Anders', lastname: 'Andersson') // Anders does a strange change of his lastname anders.lastname = "Sundstedt" assert anders.lastname == "tdetsdnuS" 25 Thursday, June 17, 2010
  • 26. SweGUG Built in syntax for lists and maps 26 Thursday, June 17, 2010
  • 27. SweGUG Lists List  syntax: def names = ['Leonard', 'Anna', 'Anders'] assert names instanceof List assert names.size() == 3 assert names[0] == 'Leonard' 27 Thursday, June 17, 2010
  • 28. SweGUG Maps def map = [name: 'Leonard', lastname: 'Axelsson'] assert map.name == 'Leonard' assert map['lastname'] == 'Axelsson' map.each{ key, value -> println "Key: $key, Value: $value" } Output: Key: name, Value: Leonard Key: lastname, Value: Axelsson 28 Thursday, June 17, 2010
  • 29. SweGUG each, find and findAll class Person { String name String lastname boolean male } def ages = [new Person(name: 'Bo', lastname: 'Olsson', male: true), new Person(name: 'Gunn', lastname: 'Bertilsson', male: false), new Person(name: 'Britt', lastname: 'Olsson', male: false)] // Print all names ages.each { println "$it.name $it.lastname" } // Find one male assert ages.find{ person -> person.male }.name == 'Bo' // or find all females assert ages.findAll{ Person p -> !p.male }.size() == 2 29 Thursday, June 17, 2010
  • 30. SweGUG Power Asserts • New in Groovy 1.7 // Will throw an assertion error def getNum() { 5 } assert (1 + 100) == num + 77 Output: Assertion failed: assert (1 + 100) == num + 77           |      |  |   |           101    |  5   82                  false at org.codehaus.groovy.runtime.InvokerHelper.assertFailed(InvokerHelper.java:378) at ... 30 Thursday, June 17, 2010
  • 31. SweGUG Method not found? • Better feedback in Groovy 1.7 // Will throw a MissingMethodException (no beginsWith method) def carType = "BMW M3" if(carType.beginsWith('Volvo')) { println "It's a Volvo!" } Output: groovy.lang.MissingMethodException: No signature of method: java.lang.String.beginsWith() is applicable for argument types: (java.lang.String) values: [Volvo] Possible solutions: endsWith(java.lang.String), startsWith(java.lang.String) at ... 31 Thursday, June 17, 2010
  • 32. SweGUG @Grab and grape • Dependency management using Apache Ivy –Uses Maven Central • grape commandline tool –Adds dependencies to Groovys global classpath • @Grab annotation –Great for scripting 32 Thursday, June 17, 2010
  • 33. SweGUG @Grab and GPars @Grab(group='org.codehaus.gpars', module='gpars', version='0.10') import groovyx.gpars.GParsExecutorsPool def importProcessingData = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 ,18, 19, 20] time('Parallel execution') { GParsExecutorsPool.withPool { importProcessingData.eachParallel { data -> // Insert arbitrary heavy operation here sleep 200 } } } time('Linear execution') { importProcessingData.each { // Insert arbitrary heavy operation here sleep 200 } } Output  (executed  on  dual-­‐core  machine): Parallel execution desc, 1449 ms.{ def time(String took: task) Linear execution took: 4006 Date().time def startTime = new ms. def result = task() def executionTime = new Date().time - startTime println "$desc took: $executionTime ms." result } 33 Thursday, June 17, 2010
  • 34. SweGUG Links • Groovy –http://groovy.codehaus.org/ • Groovy Goodness (great tips and trix) –http://mrhaki.blogspot.com/ • SweGUG –http://groups.google.com/group/swegug 34 Thursday, June 17, 2010