char
やboolean
などのプリミティブ型の配列を使う時がある.
配列に対してStream APIを用いると簡潔に操作できることが多い.
しかしArrays#stream
はint
,long
,double
以外のプリミティブな配列に対して適用できないので,そういう場合の対処法を備忘録的に書き留めておく.
始めからラッパークラスを使う
Arrays#stream
は任意のオブジェクト型の配列に対して使用できるので,ラッパークラスを使う方法.
final Character[] array = {...};
Arrays.stream(array)
...
IntStream
でインデックスを生成してマップする
本命
IntStream#range
で対象の配列分のインデックスを生成しそれらを配列の要素にマップする方法.
final char[] array = {...};
IntStream.range(0, array.length) // rangeClosedでないことに注意
.mapToObj(i -> array[i])
...
おまけ
二重配列に対して一括でstreamによる操作をしたい時はStream#flatMap
が便利
例: boolean
型二重配列の全ての要素がtrue
かを調べたい.
public void run() {
...
final boolean[][] table = ...;
Arrays.stream(table)
.flatMap(this::flatten)
.allMatch(Boolean::booleanValue);
}
private Stream<Boolean> flatten(final boolean[] array) {
return IntStream.range(0, array.length)
.mapToObj(i -> array[i]);
}