public interface DoubleStream extends BaseStream<Double,DoubleStream>
Stream
に対してdouble
プリミティブ特殊化を行ったものです。
次の例は、Stream
とDoubleStream
を使って赤色のウィジェットの重さの合計を計算する集計操作を示したものです。
double sum = widgets.stream()
.filter(w -> w.getColor() == RED)
.mapToDouble(w -> w.getWeight())
.sum();
ストリーム、ストリーム操作、ストリーム・パイプライン、および並列性の詳しい仕様については、Stream
のクラス・ドキュメントやjava.util.streamのパッケージ・ドキュメントを参照してください。Stream
, java.util.stream修飾子と型 | インタフェースと説明 |
---|---|
static interface |
DoubleStream.Builder
DoubleStream の可変ビルダーです。 |
修飾子と型 | メソッドと説明 |
---|---|
boolean |
allMatch(DoublePredicate predicate)
このストリームのすべての要素が指定された述語に一致するかどうかを返します。
|
boolean |
anyMatch(DoublePredicate predicate)
このストリームのいずれかの要素が指定された述語に一致するかどうかを返します。
|
OptionalDouble |
average()
このストリームの要素の算術平均を記述する
OptionalDouble または空のOptional (このストリームが空の場合)を返します。 |
Stream<Double> |
boxed()
このストリームの各要素を
Double にボクシングした結果から構成されるStream を返します。 |
static DoubleStream.Builder |
builder()
DoubleStream のビルダーを返します。 |
<R> R |
collect(Supplier<R> supplier, ObjDoubleConsumer<R> accumulator, BiConsumer<R,R> combiner)
このストリームの要素に対して可変リダクション操作を実行します。
|
static DoubleStream |
concat(DoubleStream a, DoubleStream b)
最初のストリームの全要素と2番目のストリームの全要素を連結したものを要素に持つ、遅延連結ストリームを作成します。
|
long |
count()
このストリームの要素の個数を返します。
|
DoubleStream |
distinct()
このストリームの重複を除いた要素から構成されるストリームを返します。
|
static DoubleStream |
empty()
空の順次
DoubleStream を返します。 |
DoubleStream |
filter(DoublePredicate predicate)
このストリームの要素のうち、指定された述語に一致するものから構成されるストリームを返します。
|
OptionalDouble |
findAny()
ストリームのある要素を記述する
OptionalDouble または空のOptionalDouble (ストリームが空の場合)を返します。 |
OptionalDouble |
findFirst()
このストリームの最初の要素を記述する
OptionalDouble または空のOptionalDouble (ストリームが空の場合)を返します。 |
DoubleStream |
flatMap(DoubleFunction<? extends DoubleStream> mapper)
このストリームの各要素をマップされたストリーム(指定されたマッピング関数を各要素に適用することで得られる)の内容で置き換えた結果から成るストリームを返します。
|
void |
forEach(DoubleConsumer action)
このストリームの各要素に対してアクションを実行します。
|
void |
forEachOrdered(DoubleConsumer action)
このストリームの各要素に対してアクションを実行します。検出順が定義されたストリームでは、各要素が検出順に処理されることが保証されます。
|
static DoubleStream |
generate(DoubleSupplier s)
指定された
DoubleSupplier によって生成される要素を含む、順序付けされていない無限順次ストリームを返します。 |
static DoubleStream |
iterate(double seed, DoubleUnaryOperator f)
初期要素
seed に関数f を繰り返し適用することで生成される、順序付けされた無限順次DoubleStream を返します(seed 、f(seed) 、f(f(seed)) 、といった要素から成るStream が生成される)。 |
PrimitiveIterator.OfDouble |
iterator()
このストリームの要素のイテレータを返します。
|
DoubleStream |
limit(long maxSize)
このストリームの要素を
maxSize 以内の長さに切り詰めた結果から成るストリームを返します。 |
DoubleStream |
map(DoubleUnaryOperator mapper)
このストリームの要素に指定された関数を適用した結果から構成されるストリームを返します。
|
IntStream |
mapToInt(DoubleToIntFunction mapper)
このストリームの要素に指定された関数を適用した結果から構成される
IntStream を返します。 |
LongStream |
mapToLong(DoubleToLongFunction mapper)
このストリームの要素に指定された関数を適用した結果から構成される
LongStream を返します。 |
<U> Stream<U> |
mapToObj(DoubleFunction<? extends U> mapper)
指定された関数をこのストリームの要素に適用した結果から構成される、オブジェクト値の
Stream を返します。 |
OptionalDouble |
max()
このストリームの最大要素を記述する
OptionalDouble または空のOptionalDouble (このストリームが空の場合)を返します。 |
OptionalDouble |
min()
このストリームの最小要素を記述する
OptionalDouble または空のOptionalDouble (このストリームが空の場合)を返します。 |
boolean |
noneMatch(DoublePredicate predicate)
指定された述語に一致する要素がこのストリーム内に存在しないかどうかを返します。
|
static DoubleStream |
of(double... values)
指定された値を要素に持つ、順序付けされた順次ストリームを返します。
|
static DoubleStream |
of(double t)
単一要素を含む順次
DoubleStream を返します。 |
DoubleStream |
parallel()
同等の並列ストリームを返します。
|
DoubleStream |
peek(DoubleConsumer action)
このストリームの要素から成るストリームを返すほか、その結果のストリームから消費される各要素に対し、指定されたアクションを実行します。
|
OptionalDouble |
reduce(DoubleBinaryOperator op)
|
double |
reduce(double identity, DoubleBinaryOperator op)
|
DoubleStream |
sequential()
同等の順次ストリームを返します。
|
DoubleStream |
skip(long n)
このストリームの最初の
n 個の要素を破棄した残りの要素で構成されるストリームを返します。 |
DoubleStream |
sorted()
このストリームの要素で構成されるストリームをソートされた順序で返します。
|
Spliterator.OfDouble |
spliterator()
このストリームの要素のスプリッテレータを返します。
|
double |
sum()
このストリーム内の要素の合計を返します。
|
DoubleSummaryStatistics |
summaryStatistics()
このストリームの要素に関する各種のサマリー・データを記述する
DoubleSummaryStatistics を返します。 |
double[] |
toArray()
このストリームの要素を含む配列を返します。
|
close, isParallel, onClose, unordered
DoubleStream filter(DoublePredicate predicate)
これは中間操作です。
DoubleStream map(DoubleUnaryOperator mapper)
これは中間操作です。
<U> Stream<U> mapToObj(DoubleFunction<? extends U> mapper)
Stream
を返します。
これは中間操作です。
IntStream mapToInt(DoubleToIntFunction mapper)
IntStream
を返します。
これは中間操作です。
LongStream mapToLong(DoubleToLongFunction mapper)
LongStream
を返します。
これは中間操作です。
DoubleStream flatMap(DoubleFunction<? extends DoubleStream> mapper)
クローズ
されます。(マップ先ストリームがnull
の場合はかわりに空のストリームが使用されます。)
これは中間操作です。
mapper
- 新しい値のDoubleStream
を生成するために各要素に適用する、非干渉でステートレスな関数Stream.flatMap(Function)
DoubleStream distinct()
Double.compare(double, double)
に従って行われます。
これはステートフルな中間操作です。
DoubleStream sorted()
Double.compare(double, double)
に従って行われます。
これはステートフルな中間操作です。
DoubleStream peek(DoubleConsumer action)
これは中間操作です。
並列ストリーム・パイプラインの場合、上流の操作によって用意された各要素に対し、任意のタイミングで任意のスレッド内でアクションが呼び出される可能性があります。アクションが共有状態を変更する場合、必要な同期を提供する責任はアクションにあります。
DoubleStream.of(1, 2, 3, 4)
.filter(e -> e > 2)
.peek(e -> System.out.println("Filtered value: " + e))
.map(e -> e * e)
.peek(e -> System.out.println("Mapped value: " + e))
.sum();
action
- ストリームから消費される要素に対して実行すべき非干渉アクションDoubleStream limit(long maxSize)
maxSize
以内の長さに切り詰めた結果から成るストリームを返します。
これは、ステートフルな短絡中間操作です。
limit()
は、順次ストリーム・パイプラインでは一般に低コストの操作ですが、順序付けされた並列パイプラインではコストが非常に高くなる可能性があります(特にmaxSize
の値が大きい場合)。任意のn個の要素を返すだけでなく、検出順での最初のn個の要素を返さなければいけない、という制約がlimit(n)
に課されるからです。状況のセマンティックスが許せば、順序付けされていないストリーム・ソース(generate(DoubleSupplier)
など)を使用するか、BaseStream.unordered()
で順序付けの制約をなくせば、並列パイプラインのlimit()
が大幅に高速化される可能性があります。検出順序との整合性が必要で、かつ並列パイプラインでのlimit()
のパフォーマンスやメモリー使用量に問題がある場合には、sequential()
で順次実行に切り替えるとパフォーマンスが改善される可能性があります。maxSize
- ストリームの要素数の上限IllegalArgumentException
- maxSize
が負の場合DoubleStream skip(long n)
n
個の要素を破棄した残りの要素で構成されるストリームを返します。このストリームに含まれる要素の数がn
個より少ない場合は、空のストリームが返されます。
これはステートフルな中間操作です。
skip()
は、順次ストリーム・パイプラインでは一般に低コストの操作ですが、順序付けされた並列パイプラインではコストが非常に高くなる可能性があります(特にn
の値が大きい場合)。任意のn個の要素をスキップするだけでなく、検出順での最初のn個の要素をスキップしなければいけない、という制約がskip(n)
に課されるからです。状況のセマンティックスが許せば、順序付けされていないストリーム・ソース(generate(DoubleSupplier)
など)を使用するか、BaseStream.unordered()
で順序付けの制約をなくせば、並列パイプラインのskip()
が大幅に高速化される可能性があります。検出順序との整合性が必要で、かつ並列パイプラインでのskip()
のパフォーマンスやメモリー使用量に問題がある場合には、sequential()
で順次実行に切り替えるとパフォーマンスが改善される可能性があります。n
- スキップする先頭要素の数IllegalArgumentException
- n
が負の場合void forEach(DoubleConsumer action)
これは終端操作です。
並列ストリーム・パイプラインの場合、この操作は、ストリームの検出順序を考慮することを保証しません。保証すると並列性のメリットが犠牲になるからです。与えられた任意の要素に対し、ライブラリが選択した任意のタイミングで任意のスレッド内でアクションが実行される可能性があります。アクションが共有状態にアクセスする場合、必要な同期を提供する責任はアクションにあります。
action
- 要素に対して実行する非干渉アクションvoid forEachOrdered(DoubleConsumer action)
これは終端操作です。
action
- 要素に対して実行する非干渉アクションforEach(DoubleConsumer)
double[] toArray()
これは終端操作です。
double reduce(double identity, DoubleBinaryOperator op)
double result = identity;
for (double element : this stream)
result = accumulator.applyAsDouble(result, element)
return result;
ただし、順次実行の制約が課されるわけではありません。
identity
値はアキュムレータ関数の単位元でなければいけません。つまり、すべてのx
について、accumulator.apply(identity, x)
がx
に等しくなります。アキュムレータ
関数は結合的な関数でなければいけません。
これは終端操作です。
double sum = numbers.reduce(0, (a, b) -> a+b);
あるいは、次のようによりコンパクトにします。
double sum = numbers.reduce(0, Double::sum);
これは、単純にループで中間合計を更新していく方法に比べて遠回りな集計方法に見えるかもしれませんが、リダクション操作の並列化が容易に行え、並列化の際に同期を追加する必要がなく、データ競合のリスクも大幅に減少します。
identity
- 蓄積関数に対する単位元の値op
- 2つの値を結合するための結合的、非干渉およびステートレスな関数sum()
, min()
, max()
, average()
OptionalDouble reduce(DoubleBinaryOperator op)
OptionalDouble
を返します。これは、次の操作に相当します。
boolean foundAny = false;
double result = null;
for (double element : this stream) {
if (!foundAny) {
foundAny = true;
result = element;
}
else
result = accumulator.applyAsDouble(result, element);
}
return foundAny ? OptionalDouble.of(result) : OptionalDouble.empty();
ただし、順次実行の制約が課されるわけではありません。
アキュムレータ
関数は結合的な関数でなければいけません。
これは終端操作です。
op
- 2つの値を結合するための結合的、非干渉およびステートレスな関数reduce(double, DoubleBinaryOperator)
<R> R collect(Supplier<R> supplier, ObjDoubleConsumer<R> accumulator, BiConsumer<R,R> combiner)
ArrayList
のような可変の結果コンテナであり、結果を置き換えるかわりに結果の状態を更新することによって要素が組み込まれるようなリダクションのことです。これは次と同等の結果を生成します。
R result = supplier.get();
for (double element : this stream)
accumulator.accept(result, element);
return result;
collect
操作はreduce(double, DoubleBinaryOperator)
と同様、同期を追加しなくても並列化できます。
これは終端操作です。
double sum()
return reduce(0, Double::sum);
しかし、浮動小数点合計は正確ではないため、上記コードは、このメソッドが行う合計計算と必ずしも同等になりません。
いずれかのストリーム要素がNaNであるか、合計がある時点でNaNになる場合、合計はNaNになります。浮動小数点合計の値は、入力値と加算操作順序の両方の関数になります。このメソッドの加算操作の順序は意図的に未定義になっていますが、それは、実装が計算結果の速度や精度を柔軟に改善できるようにするためです。特に、このメソッドを補正加算などのテクニックを使って実装すれば、double
値の単純な合計に比べ、数値合計の誤り限界を減らせます。
これは終端操作です。
OptionalDouble min()
OptionalDouble
または空のOptionalDouble (このストリームが空の場合)を返します。いずれかのストリーム要素がNaNの場合、最小要素はDouble.NaN
になります。数値比較演算子とは異なり、このメソッドは負のゼロが厳密には正のゼロよりも小さいと見なします。これはリダクションの特殊な場合であり、次と同等になります。
return reduce(Double::min);
これは終端操作です。
OptionalDouble
または空のOptional (ストリームが空の場合)OptionalDouble max()
OptionalDouble
または空のOptionalDouble (このストリームが空の場合)を返します。いずれかのストリーム要素がNaNの場合、最大要素はDouble.NaN
になります。数値比較演算子とは異なり、このメソッドは負のゼロが厳密には正のゼロよりも小さいと見なします。これはリダクションの特殊な場合であり、次と同等になります。
return reduce(Double::max);
これは終端操作です。
OptionalDouble
または空のOptional (ストリームが空の場合)long count()
OptionalDouble average()
OptionalDouble
または空のOptional (このストリームが空の場合)を返します。記録された値のいずれかがNaNであるか、合計がある時点でNaNになる場合、平均はNaNになります。
返される平均は、値が記録されている順序によって変わる可能性があります。このメソッドを補正加算などのテクニックを使って実装すれば、平均の計算に使用される数値合計
の誤り限界を減らせます。
平均は、リダクションの特殊な場合です。
これは終端操作です。
OptionalDouble
または空のオプション(ストリームが空の場合)DoubleSummaryStatistics summaryStatistics()
DoubleSummaryStatistics
boolean anyMatch(DoublePredicate predicate)
false
が返され、述語は評価されません。
これは短絡終端操作です。
boolean allMatch(DoublePredicate predicate)
true
が返され、述語は評価されません。
これは短絡終端操作です。
boolean noneMatch(DoublePredicate predicate)
true
が返され、述語は評価されません。
これは短絡終端操作です。
OptionalDouble findFirst()
OptionalDouble
または空のOptionalDouble
(ストリームが空の場合)を返します。ストリームが検出順序を持たない場合は、任意の要素が返されます。
これは短絡終端操作です。
OptionalDouble
または空のOptionalDouble
(ストリームが空の場合)OptionalDouble findAny()
OptionalDouble
または空のOptionalDouble
(ストリームが空の場合)を返します。
これは短絡終端操作です。
この操作の動作は明らかに非決定論的です。ストリームの任意の要素を自由に選択できます。これは、並列処理でのパフォーマンスを最大化できるようにするためです。デメリットは、同じソースに対して呼び出すたびに、違う結果が返される可能性がある点です。(安定した結果が必要な場合は、かわりにfindFirst()
を使用してください。)
OptionalDouble
または空のOptionalDouble
(ストリームが空の場合)findFirst()
DoubleStream sequential()
BaseStream
これは中間操作です。
sequential
、インタフェース BaseStream<Double,DoubleStream>
DoubleStream parallel()
BaseStream
これは中間操作です。
parallel
、インタフェース BaseStream<Double,DoubleStream>
PrimitiveIterator.OfDouble iterator()
BaseStream
これは終端操作です。
iterator
、インタフェース BaseStream<Double,DoubleStream>
Spliterator.OfDouble spliterator()
BaseStream
これは終端操作です。
spliterator
、インタフェース BaseStream<Double,DoubleStream>
static DoubleStream.Builder builder()
DoubleStream
のビルダーを返します。static DoubleStream empty()
DoubleStream
を返します。static DoubleStream of(double t)
DoubleStream
を返します。t
- 単一要素static DoubleStream of(double... values)
values
- 新しいストリームの要素static DoubleStream iterate(double seed, DoubleUnaryOperator f)
seed
に関数f
を繰り返し適用することで生成される、順序付けされた無限順次DoubleStream
を返します(seed
、f(seed)
、f(f(seed))
、といった要素から成るStream
が生成される)。
DoubleStream
の最初の要素(位置0
)は、指定されたseed
になります。n > 0
の場合、位置n
の要素は、位置n - 1
の要素に関数f
を適用した結果になります。
seed
- 初期要素f
- 新しい要素を生成するために1つ前の要素に適用される関数DoubleStream
static DoubleStream generate(DoubleSupplier s)
DoubleSupplier
によって生成される要素を含む、順序付けされていない無限順次ストリームを返します。これは、定数ストリームやランダムな要素から成るストリームなどを生成するのに適しています。s
- 要素を生成するためのDoubleSupplier
DoubleStream
static DoubleStream concat(DoubleStream a, DoubleStream b)
StackOverflowException
が発行される可能性さえあります。a
- 最初のストリームb
- 2番目のストリーム バグまたは機能を送信
詳細なAPIリファレンスおよび開発者ドキュメントについては、Java SEのドキュメントを参照してください。そのドキュメントには、概念的な概要、用語の定義、回避方法、有効なコード例などの、開発者を対象にしたより詳細な説明が含まれています。
Copyright© 1993, 2014, Oracle and/or its affiliates. All rights reserved.