James StrachanはGroovyはオブジェクト指向スクリプト言語Rubyから大きな影響を受けていることを何度か公言している。実際、クロージャの仕様や表記、その他予約語の選択などにおいてRubyからの影響を色濃く見ることができる。その他、Python、Dylan、Smalltalkなどからも言語機能が取り込まれている。
GroovyからJava SEの標準APIをすべて呼び出すことができるが、この際にGroovyから使うと便利なメソッドがリフレクションを用いてJava SEクラスに擬似的に多数追加されている。例えば、クロージャをとるFile#eachLine()といったメソッドを使用することができ、以下の様な記述が可能となっている。new File("test.txt").eachLine { println it }File#eachLine(Closure)はそれぞれの行の値を変数itに代入してクロージャを呼び出す、という繰り返し処理を行うだけでなく、処理の終了時もしくは例外の発生時に、ファイルのクローズ処理を行う。つまりJavaの場合必要なfinally節におけるclose処理を必要とせず簡潔に記述できる。他に同様に、Reader#eachLine(Closure)メソッドなども追加されている。また、File#getText(String characterCodeSetName)、Reader#getText()、Reader#readLines()というファイルの全ての内容を一括で読み込むメソッドが追加されており、入出力処理を簡潔に記述することができる。
Groovyではコードブロックをファーストクラス（第一級）オブジェクトとして生成し、変数に格納したりメソッド引数や戻り値として受け渡したりすることができる。Groovyのライブラリは繰り返し処理や入出力処理などを中心にクロージャが駆使されており、簡潔な表記を行うことができる。クロージャは構築されたスコープ内の変数を読み書きできる。def str = "Hello World"def readerClosure = { println str }readerClosure()def writerClosure = { str = "foo" }writerClosure()println strこのコードを実行するとHello Worldfooと出力される。
未実装のメソッドをuseブロック内で起動すると、ブロックで指定したクラスのクラスメソッドに処理をディスパッチする。import groovy.inspect.Inspectoruse (Category.class) {    def obj = "Hoge"    println obj.getShortClassName()    println obj.toString()}//名前は自由class Category {    //最初の引数は、メソッドが起動されたインスタンスの参照コピー    static getShortClassName(obj) {        Inspector.shortName(obj.getClass())    }    //実装メソッドと重複する場合、Groovyはカテゴリーより実装メソッドを優先    static String toString(Object obj) {        "Hello World"    }}はStringHogeと出力される。
Groovyは未実装のフィールドの参照と代入、未実装のメソッドの起動をキャッチしGroovyObjectのメソッドを起動する。GroovyObject#getProperty(String name)GroovyObject#setProperty(String name, Object value)GroovyObject#invokeMethod(String name, Object arguments)以下、Expando を使用した例である。def obj = new Expando()obj.greetingMessage = "Hello World"obj.greet = { println greetingMessage }obj.greet()obj.message = "foo"println obj.messageまた、連想配列を使用しても、似た構文が可能である。thisの意味が変わる。def obj = [:]obj.greetingMessage = "Hello World"obj.greet = { println obj.greetingMessage }obj.greet()obj.message = "foo"println obj.message
デフォルト引数（メソッド・コンストラクタ呼び出しチェインの自動生成）。def greet(mess = "Hello World") {    println mess}greet()greet("foo")はHello Worldfooと出力される。
Getter、Setterメソッドは自動生成される。フィールドアクセスの記法でGetter、Setterメソッドを呼び出すことができる。class Pojo {    def name}def pojo = new Pojo(name:"名前")println pojo.getName() // getName()が生成されているprintln pojo.name // getName()が呼ばれる
通常の for と for in がある。for を使うと、break や continue が使える。@CompileStatic を付けた状態では、C言語スタイルの for ループかつループ変数に型を付けた状態が最速であり、Java言語と同等の速度で動く。each や times はクロージャ呼び出し分の時間がかかる。for (int i = 0; i < 3; i++) { println "$i: Hello" }for (i in 1..3) { println "$i: Hello" }(1..3).each { println "$it: Hello" }3.times { println "$it: Hello" }
1901年に東京市日本橋三越前に生まれる。その後牛込に移り、旧制中学の生徒時代にカメラを購入して東京市電（当時）の写真撮影を始める。撮影したコレクションは1923年の関東大震災で灰燼に帰したが、その後改めてコレクションや撮影に取り組んだ。1917年、薬剤師免許取得。1930年ごろから鉄道研究に本腰を入れ始め、1936年東京市電の原稿を鉄道趣味に投稿し掲載される。1940年には同好会「つばめクラブ」を結成する。しかし、太平洋戦争に向かう時勢により「つばめクラブ」は短期間の活動で終わった。太平洋戦争終結直後の1946年に東京鉄道同好会を設立。1953年には、東京鉄道同好会を交通博物館が中心となって結成された交通科学研究会に合併させる形で結成された、鉄道友の会の発起人の一人として名を連ねた。本業は薬剤師であり、タカマツドラッグストアの取締役社長を務めたが、経営の陰には妻のサポートがあった。1990年8月14日死去。89歳没。