可変長引数は、実際には配列として扱われるので、引数に配列を使用することもできます(リスト9)。
リスト9●配列からのストリーム生成
String[] texts = ……;
Stream.of(texts)
.forEach(t -> System.out.println(t));
このようにofメソッドでも配列からストリームを生成することが可能です。実際にはofメソッドは内部でArrays.streamメソッドをコールしているだけです。
range/rangeClosedメソッド
rangeメソッドとrangeClosedメソッドはIntStreamインタフェース、LongStreamインタフェースのみで使用できるファクトリメソッドです。
rangeメソッドとrangeClosedメソッドは範囲を指定してストリームを生成します。第1引数が初期値、第2引数が上限です。
rangeメソッドとrangeClosedメソッドの違いは、上限の値を含むか、含まないかの違いです。例えば、リスト10のように同じ引数でIntStreamオブジェクトを生成してみます。
リスト10●range/rangeClosedメソッドの使用例
// 0から4までのストリーム
IntStream.range(0, 5)
.forEach(x -> System.out.println(x));
// 0から5までのストリーム
IntStream.rangeClosed(0, 5)
.forEach(x -> System.out.println(x));
rangeメソッドもrangeClosedも0と5を引数にとっています。この時、rangeメソッドで生成したIntStreamオブジェクトの要素は[0, 1, 2, 3, 4]となり、5を含みません。一方、rangeClosedメソッドで生成したIntStreamオブジェクトの要素は[0, 1, 2, 3, 4, 5]となり、5を含んでいます。
終わりに
今回は、Stream APIの基本的な部分を説明しました。
ストリームは内部イテレータを実現するインタフェースであり、イテレーションでの処理をラムダ式として表します。ストリームの処理の流れは、ストリームを生成し、中間操作を経た後、終端操作で返り値を集約します。
今回はストリームの生成まで説明しました。次回は、中間操作と終端操作にどのような操作があって、それらを用いてどのような処理を行うのかについて説明していきます。
写真を撮ることは、櫻庭の好きなことの1つです。
今メインで使っているカメラは、使い始めてちょうど1年半経ちました。昨年はあまり写真を撮らなかった印象があるのですが、それでも5万枚は撮ったらしいです。
現在の悩みは、撮りっぱなしになっている写真が多いこと。JPEGではなく、RAWで撮っているので、いわゆる現像作業をしなくてはいけません。ところが、それがまったくできていないのです。
今年は、なるべく撮りっぱなしをなくしていきたいと思っています。しかし、すでに今年になって撮った写真も、そのまま撮りっぱなしになっているものが多いので、前途多難です。