電卓片手に

java.util.stream.Stream の分割

投稿日:

大量のデータを取得して順次処理をする処理を書くときに、Guava の FluentIterable を便利に使っていたけれど、そもそも Iterable だと2度目の iterator() を呼ぶことを想定していないのにウッカリ使ってしまうケースが たまにあったのでこれらを Java 8 からできた Stream に置き換えようという 話が出た。

しかし Stream には Iterables#partition のように固定長に分割する機能がなく、 自分で実装する必要があった。

実装がこれ:

Spliterator の実装を初めてやったけれど、そんなに難しくないし便利かもしれない。 characteristics 周りの仕様と、そのビットフラグの操作には慣れてないので もう少し別のやり方があるかもしれない。

ついでに上述した「大量のデータを取得して順次処理をする」ための、List とかで受け取って 1つの Stream に遅延結合するための処理はこれ:

このあたり、いずれ apach-commons とか guava が実装しそうなのでそんなに熱心に書こうと思わない。