8
8

More than 5 years have passed since last update.

ふたつの Iterator を LINQ で、そして LINQ を Java にも

Last updated at Posted at 2014-03-18

を拝見しました。

コメントで「Zip じゃん」というのがあり、「確かに!」と思ったのでやってみました。

C# の場合

// using using System.Linq;

var arr1 = new int[] { 1, 2, 3, 4, 5 };
var arr2 = new string[] { "hoge", "fuga", "piyo" };

arr1.Zip(arr2, (x, y) =>  new {x, y})
    .ToList()
    .ForEach(Console.WriteLine);

結果

{ x = 1, y = hoge }
{ x = 2, y = fuga }
{ x = 3, y = piyo }

うむ、シンプル。要素数が違ってても少ない方に合わせてくれます。

Java7以前 の場合

reactive4java というライブラリがありまして、これは Java で Reactive Extensions を実現するライブラリなのですが、LINQ的な機能が Interactive というクラスで提供されています。

これを使うと Zip ができます。

//import hu.akarnokd.reactive4java.base.Func2;
//import hu.akarnokd.reactive4java.interactive.Interactive;

Iterable<Integer> array1 = Arrays.asList(1, 2, 3, 4, 5);
Iterable<String> array2 = Arrays.asList("hoge", "fuga", "piyo");

Iterator<Pair<Integer, String>> zippedIter = 
        Interactive.zip(array1, array2, 
                new Func2<Integer, String, Pair<Integer, String>>() {
    @Override
    public Pair<Integer, String> invoke(Integer x, String y) {
        return new Pair<Integer, String>(x, y);
    }
}).iterator();

while (zippedIter.hasNext()) {
    Pair<Integer, String> p = zippedIter.next();
    Log.d("StartupActivity", String.format("x=%d, y=%s", p.first, p.second));
}

ああ、Android で試したので Pair とか使ってしまった。
普通の Java の場合は自作の Tuple などに置き換えを。

結果

x=1, y=hoge 
x=2, y=fuga 
x=3, y=piyo 

C# より冗長ですけど、いい感じで利用できるのではと思います。

reactive4java が Java8 のラムダ式に対応してくれると、上のコードはもっと簡潔に書けます。

Reactive4Java8 にて、対応してる感じが見られますが、Top ページ によると、どうやら、「reactive4java の開発は終了し、RxJava の開発に参加するつもりだ」みたいなことが書いてあります。

また、RxJava でなく reactive4java を使う利点として、Interactive 機能群の存在を挙げています。
単純に LINQ 的な機能を Java7以前 で使いたいならば、 reactive4java はまだまだ役に立つと思います。

Java8 の場合

では、「Streams.zip があるよ」と書いてあって「おお!」と思ったのですが、リリースされた JDK8 のドキュメント を見たら、このクラスは見つからず…(java.util.stream.Stream にも無く)。開発の過程で無くなってしまったのでしょうか、残念。。。

最後に、もしあなたが Android 開発をしていて、Java の冗長さに嫌気がさしているなら、Xamarin へどうぞ

8
8
1

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
8
8