たとえば…List
を分割したい!
ウェブサービスのAPIを叩く場合などで処理単位が決まっていて n 件ずつ処理したい! というシチュエーションはちょこちょこあるかと思います。こういうときList<Object>
を List<List<Object>>
に変換し、Object
の要素数を任意の数に指定して分割できたら全部解決しますよね。
試しに、自分で書いてみました!!! これで解決しちゃうよ!!!
list.stream().collect(Collectors.groupingBy(i -> (list.indexOf(i) / 5))).values().forEach(elements5 -> {
//処理
});
う…うげー、なんか動いてるけどコレじゃない…絶対コレじゃない
こ、これならむしろfor文の方がよくない!?
わかりやすく書きたい…
list.stream().chunked(5).forEach(elements5 -> {
//処理
});
こんな風に書けたらいいですよね!
たとえば….collect(Collectors.toList)
とか長くないですか?
list.stream().filter(i -> foobar(i)).collect(Collectors.toList);
この .collect(Collectors.toList)
ちょっとぱっと見ごちゃっとしてて見づらくないですか?
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に以下を追加しました:
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
実際に使ってみる
を参照しました。
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]
便利!