AndroidでStream APIっぽいことをしたい場合

次世代のSDKから,Androidでも
ラムダ式やStream APIなどのJava8相当機能が
使えるようになるそうですね.

First Preview of Android N: Developer APIs & Tools | Android Developers Blog

で,恥ずかしながら,
「そもそも今のAndroid開発環境でも頑張ればStream API使えるよ」
というのを今更ながら知ったので,メモっておく.

Stream APIというのは,Java8から実装された概念で,
荒っぽく言うならば「for文この世から抹消しようぜ」なAPI
リファレンスは下記.

Stream (Java Platform SE 8)

サンプルをそのまま引っ張ってきてみる.

int sum = widgets.stream() //widgetsというコレクションにstream API適用するぜ!という宣言
                 .filter(w -> w.getColor() == RED) //colorプロパティがREDのものでフィルタリング
                 .mapToInt(w -> w.getWeight()) //weightプロパティをコレクション対象に置換
                 .sum(); //その合計値を返却

Java7までならば,for文で手続的に記述されていた箇所が,
Stream APIにより,宣言的に記述できるようになる.

で,これを素直にやろうとすると怒られるんだけど,
どうやら以下の「LightWeight-Stream-API」を使うと
適用できるようになるらしい.というか実際,試したら出来た.

GitHub - aNNiMON/Lightweight-Stream-API: Stream API from Java 8 rewrited on iterators for Java 7 and below

Java8のStream APIで出来ることは大体これで代用できるが,
上記の例で言うところのsumがない.
作者によると
「既存の関数の組み合わせで出来るし.それ実装したら"lightweight"ちゃうやんけ」
とのこと.以下がそのやりとり.

Sum operator is not implemented · Issue #10 · aNNiMON/Lightweight-Stream-API · GitHub

なお,前提としてラムダ式を使っているので,
Retrolambdaなどのプラグインも入れておく必要がある.

GitHub - evant/gradle-retrolambda: A gradle plugin for getting java lambda support in java 6, 7 and android


ひとまずこれでStreamを使いこなす練習をしておこうかと.