Eclipseで始めるScala、Groovy 比較編

# 準備
とりあえず環境構築については[前回を参照]()
あとClojureはIDE使って開発する文化ではなさそうなんで割愛

## 今回のテーマ
割とよくあるネット上のJSONデータを取得して
一覧にして表示させるというプログラムを
それぞれの言語で書いてみて比較してみようと思う。

前提条件として以下を使用

* 元データはQiitaのAPIを叩く
* JSONのパースにはGSONを使う

Qiitaで書いてる＆JSONでデータ返してくれるのでおあつらえ向き
GSONはJSONパースを楽する面＋Javaのライブラリをどんな感じで処理するのかの目安にもなるかなと

## Java
とりあえず比較の基本となるJavaで書いてみる

```java:JavaTest.java
package net.zantetu;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;

import com.google.gson.Gson;

public class JavaTest {

	public static void main(String[] args) throws Exception {
		try(BufferedReader br = new BufferedReader(new InputStreamReader(new URL("https://qiita.com/api/v2/users/aono-masashi/items").openStream()))){
			for(QiitaItem item : new Gson().fromJson(br, QiitaItem[].class)){
				System.out.println(item.getTitle() + "\t" + item.getUrl());
			}

		}
	}

	private class QiitaItem {

		private String title;
		private String url;

		public String getTitle() {
			return title;
		}
		public void setTitle(String title) {
			this.title = title;
		}
		public String getUrl() {
			return url;
		}
		public void setUrl(String url) {
			this.url = url;
		}
	}
}
```
```text:実行結果
エポックタイムの扱いでハマった話	http://qiita.com/aono-masashi/items/d1519010919c3915e291
Eclipseで始めるScala、Clojure、Groovy 準備編	http://qiita.com/aono-masashi/items/fad9560faf8c52ff1d30
ナイーブベイズ分類器をjavaで実装してみる	http://qiita.com/aono-masashi/items/fd633c3efe1b361d4088
neologd使って形態素解析したい。できれば依存関係とかは丸投げで。	http://qiita.com/aono-masashi/items/c4f2d1b62589938a6238
javaでjsonから各種ライブラリに対応するbeanを簡単に作成する方法	http://qiita.com/aono-masashi/items/c34031008729a0868021
XMLからJAXBのbeanを簡単に作る方法	http://qiita.com/aono-masashi/items/a8b30d1892732e7e5f1b
```
うーん、java7からautocloseableとかできて大分簡潔にかけるようになったけどやっぱちょっとコード量多いな
GSONの受け取りObjectとしてPOJOを作ってるところも煩雑

## Scala

```scala:ScalaTest.scala
package net.zantetu

import com.google.gson.Gson
import java.io.BufferedReader
import scala.io.Source

object ScalaTest extends App {
  for(item:QiitaItem <- new Gson().fromJson(Source.fromURL("https://qiita.com/api/v2/users/aono-masashi/items").reader(), classOf[Array[QiitaItem]])) {
    println(item.title + "\t" + item.url)
  }
}

class QiitaItem {
  var title: String = _
  var url: String = _
}
```
```text:実行結果
エポックタイムの扱いでハマった話	http://qiita.com/aono-masashi/items/d1519010919c3915e291
Eclipseで始めるScala、Clojure、Groovy 準備編	http://qiita.com/aono-masashi/items/fad9560faf8c52ff1d30
ナイーブベイズ分類器をjavaで実装してみる	http://qiita.com/aono-masashi/items/fd633c3efe1b361d4088
neologd使って形態素解析したい。できれば依存関係とかは丸投げで。	http://qiita.com/aono-masashi/items/c4f2d1b62589938a6238
javaでjsonから各種ライブラリに対応するbeanを簡単に作成する方法	http://qiita.com/aono-masashi/items/c34031008729a0868021
XMLからJAXBのbeanを簡単に作る方法	http://qiita.com/aono-masashi/items/a8b30d1892732e7e5f1b
```
Javaに比べれば大分すっきりしている。
一番ハマったところは```classOf[Array[QiitaItem]]```で配列のClassオブジェクトを取得してるところ
scalaだと```QiitaItem[].class```みたいな感じでClassオブジェクトを取得できないみたい
GSONの受け取り用クラスQiitaItemは大分すっきりしてる。

## Groovy
```groovy:GroovyTest.groovy
import com.google.gson.Gson

new Gson().fromJson(new URL("https://qiita.com/api/v2/users/aono-masashi/items").newReader(), Object[]).each {
	println it.title + "\t" + it.url
}
```
```text:実行結果
エポックタイムの扱いでハマった話	http://qiita.com/aono-masashi/items/d1519010919c3915e291
Eclipseで始めるScala、Clojure、Groovy 準備編	http://qiita.com/aono-masashi/items/fad9560faf8c52ff1d30
ナイーブベイズ分類器をjavaで実装してみる	http://qiita.com/aono-masashi/items/fd633c3efe1b361d4088
neologd使って形態素解析したい。できれば依存関係とかは丸投げで。	http://qiita.com/aono-masashi/items/c4f2d1b62589938a6238
javaでjsonから各種ライブラリに対応するbeanを簡単に作成する方法	http://qiita.com/aono-masashi/items/c34031008729a0868021
XMLからJAXBのbeanを簡単に作る方法	http://qiita.com/aono-masashi/items/a8b30d1892732e7e5f1b
```
圧倒的なコード量の無さ・・・
Groovyだと拡張してるメソッドがいろいろあってIO周りはダントツに使いやすい
しかもそれをクロージャで受け取って書けるので煩雑になりにくい
GSONの受け取りクラスも動的型付けしてくれるので配列になることだけを入れればいい
しかも.classもいらない・・・

## 総評
個人的にはJavaのエンジニアなのでGroovyが一番そそられる
圧倒的なコード量の無さと動的型付けでJavaの煩わしい部分が大分解消される
しばらくはGroovyもいじってみようかなと思った。
理由としては

1. Javaのコードをそのまま書いてもほぼ動く
1. ↑の理由から過去の遺産の再利用が楽
1. IO周りの処理が多いバッチ系を作るときには相性バッチリ
1. GradleってGroovyで動いてるのでGradle覚えるついでに覚えれる

って感じです。