LoginSignup
37
35

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-08-26

たとえば…Listを分割したい!

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

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

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

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

わかりやすく書きたい…

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に以下を追加しました:

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

実際に使ってみる

を参照しました。

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:

37
35
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
37
35