began.2014-09-11Groovy-streamで遊ぶGroovy某言語を使っていると、とにかくwhile/break/continueを避けたくなるものですが、Groovyにその言語のIterator.continually的なものがないかなーと思って探していたら、以下のものに辿り着きました。Groovy-streamhttp://timyates.github.io/groovy-stream/https://github.com/timyates/groovy-streamGroovyで、Streamを実現するためのライブラリのようです。チュートリアルを見つつ使ってみましょう。上記サイトのトップページにチュートリアルがあります。あとは、Javadocを。http://timyates.github.io/groovy-stream/javadoc/依存関係の引き込みには、Grapeを使うことにします。現時点での最新版は、0.8.1です。チュートリアルが0.6.2と書いているのは、罠な気がしますね...。groovy.stream.Streamimport文としては、とりあえず上記があればよいみたいです。使い方ですが、このStreamクラスのfromメソッドが起点になります。いくつかオーバーロードされたメソッドが存在しますが、まずはClojureを与えるものから。}.take(3).collect()fromの中が繰り返し評価されますが、takeで3つ分だけに切り取り、その後collectメソッドでListに変換しています。Stream#fromメソッドはStreamを返し、その他のStreamメソッド(上記ではtake)もやはりStreamを返します。StreamクラスはIteratorを実装しているので、適当なところでコレクションに変換するなりeachで回すなりするとよいでしょう。Stream#fromは、コレクションを引数に取ることもできます。}.collect()mapメソッドは、Streamクラスのメソッドです。これは有限のStreamですね。}だと無限Streamになるわけです。単一の値を与え、その繰り返しのStreamを作成することもできます。Stream.from(1).take(5).collect()やはり、これも無限Streamです。キーとIterableのペアを与えることで、Mapを生成することもできます。5]).collect()生成される組み合わせは、ネストしたforみたいな評価順になってますね。その他、各種メソッド。skipで指定された数分の要素を飛ばします。5]).skip(3).collect()filterで、述語を満たすもののみ残します。}.collect()collateで、分割を行います。5).collate(3).collect()collateの引数を増やすと、動きが変わります。1).collect()3つ引数を取るバージョンもあるみたいです。その他の例は、チュートリアルや以下を見てください。Functionshttp://timyates.github.io/groovy-stream/map.html依存関係もGroovyしかないし、良いのではないでしょうか?その他、評価順の確認をしてみましょう。以下のようなテキストを用意。languages.txtJavaScalaGroovy#ClojureKotlinこれを読み込むコードを用意。「#」で始まる行は、コメントとしてスキップ。}}あ...until使った...。実行すると、こういう結果になります。JavaScalaGroovyKotlin評価順を確認するため(ソースあんまり読んでない)に、こんなコードに変形。untilなるほど、ループは増えない(操作はまとめて実行する)系ですね。見た限りは、Iteratorを積み重ねる実装になっているようです。深くは追ってませんけど。8.0.0.Finalがリリースされました(今は8.0.1...2014-12-21GroovyからJSR-223(ScriptEngine)を使ってGroovyを呼ぶ小ネタ系エントリ。CQLでJDBCほんの、触りだけです。5はてなブログをはじめよう!Kazuhiraさんは、はてなブログを使っています。ブログを報告する引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。