[ Java8 ] Lombok + Xanadu で快適 Stream API コーディング！

#たとえば…`List`を分割したい！

　ウェブサービスのAPIを叩く場合などで処理単位が決まっていて n 件ずつ処理したい！　というシチュエーションはちょこちょこあるかと思います。こういうとき`List<Object>` を `List<List<Object>>` に変換し、`Object`の要素数を任意の数に指定して分割できたら全部解決しますよね。

試しに、自分で書いてみました！！！　これで解決しちゃうよ！！！ :heart_eyes: 

```java
list.stream().collect(Collectors.groupingBy(i -> (list.indexOf(i) / 5))).values().forEach(elements5 -> {
   //処理
});
```

う…うげー、なんか動いてるけどコレじゃない…絶対コレじゃない :cold_sweat: 
こ、これならむしろfor文の方がよくない！？ :scream: 

わかりやすく書きたい…

```java
list.stream().chunked(5).forEach(elements5 -> {
   //処理
});
```
こんな風に書けたらいいですよね！

#たとえば…`.collect(Collectors.toList)` とか長くないですか？

```java
list.stream().filter(i -> foobar(i)).collect(Collectors.toList);
```

この `.collect(Collectors.toList)` ちょっとぱっと見ごちゃっとしてて見づらくないですか？

```java
list.stream().filter(i -> foobar(i)).toList();
```

もし、こういう風に書けたらとっても便利ですよね。
ここで Xanadu の登場です！

#Xanadu 

https://github.com/gakuzzzz/xanadu
Java8 でソースを記述するにあたって Guava や GS Collections のように機能を置き換えるのではなく、既存の標準APIをそのまま拡張してもっと便利に書けるようにというコンセプトで作られた便利ライブラリのようです。実行には Lombok が必要となります。

作者は play2-auth (Scala + Play Framework) のリードコミッターでもある @gakuzzzz氏 (https://twitter.com/gakuzzzz)

#Lombokのインストール

こちらの投稿を参照：
http://qiita.com/yyoshikaw/items/32a96332cc12854ca7a3
（本家は： https://projectlombok.org/mavenrepo/index.html ）

#ビルドツールの設定

私の場合は sbt を使用していましたので、build.sbtに以下を追加しました：

```scala:build.sbt
resolvers += Resolver.sonatypeRepo("snapshots") //sbtのバージョンによっては直接URL指定の必要あり

libraryDependencies ++= Seq(
    "org.projectlombok" % "lombok" % "1.16.6",
    "jp.t2v" % "xanadu" % "0.1.0-SNAPSHOT"
)
```

Gradleについては[README](https://github.com/gakuzzzz/xanadu/blob/master/README.md#using-gradle) をご参照下さい：
https://github.com/gakuzzzz/xanadu/blob/master/README.md#using-gradle

#実際に使ってみる

https://github.com/gakuzzzz/xanadu/tree/master/src/test/java/jp/t2v/xanadu/ops

を参照しました。

```Java:SampleForXanadu.java
package foo.bar.foobar;

import java.util.Arrays;
import java.util.List;

import jp.t2v.xanadu.ops.ListOps;
import jp.t2v.xanadu.ops.StreamOps;
import lombok.experimental.ExtensionMethod;

@ExtensionMethod({ListOps.class, StreamOps.class})
public class SampleForXanadu {
	public static void main(final String args[]) {
		final List<String> chairpersons  = Arrays.asList("J.Yellen", "B.Bernanke", "A.Greenspan", "P.A.Volcker", "G.W.Miller", "A.F.Burns", "W.M.Martin Jr.", "T.B.McCabe", "M.S.Eccles", "E.R.Black");
		final List<List<String>> chunkedChairpersons = chairpersons.stream().chunked(3).toList();
		
		System.out.println(chunkedChairpersons);
		System.out.println("============================");		
		chunkedChairpersons.forEach(System.out::println);
		System.out.println("============================");
		System.out.println(chunkedChairpersons.flatten());
	}
}



```

実行結果：

```
[[J.Yellen, B.Bernanke, A.Greenspan], [P.A.Volcker, G.W.Miller, A.F.Burns], [W.M.Martin Jr., T.B.McCabe, M.S.Eccles], [E.R.Black]]
============================
[J.Yellen, B.Bernanke, A.Greenspan]
[P.A.Volcker, G.W.Miller, A.F.Burns]
[W.M.Martin Jr., T.B.McCabe, M.S.Eccles]
[E.R.Black]
============================
[J.Yellen, B.Bernanke, A.Greenspan, P.A.Volcker, G.W.Miller, A.F.Burns, W.M.Martin Jr., T.B.McCabe, M.S.Eccles, E.R.Black]
```

便利！ :neckbeard: