2015-09-14 3 views
8

List<Double>からDoubleStream(合計、平均などの使用)を作成する最もエレガントな方法をお探しです。私はそのようなコードを持っている現時点では:コレクション<Double>からダブルストリーム

List<Double> doubles = getListOfDoubles(); 
double sum = doubles.stream() 
        .mapToDouble(d -> d) 
        .sum(); 

たぶん誰もが短い方法を提案するだろうか?あなたが行うことができます

+0

私が意味する、私たちはArrays.toStream(...)をオーバーロードしています

DoubleStreamCollection<Double>を変換する一般的なケースは、あなたが既に持っているコードで行うことができることに注意してくださいストリームなので、コレクションには何も似ていないのはなぜですか? – Anatrollik

+0

「アレイ」にはどこがありますか? – RealSkeptic

+0

@RealSkeptic [配列のjavadoc]( ) 'static DoubleStream \tストリーム(double []配列) を返します。指定された配列をソースとして持つシーケンシャルなDoubleStreamです。 IntStream、LongStreamに似ています PS申し訳ありませんが、フォーマットは – Anatrollik

答えて

10

Streamから統計情報を取得する最も良い方法は、...SummaryStatisticsクラスを使用することです。 Stream<Double>ため、これはDoubleSummaryStatisticsある:

List<Double> doubles = getListOfDoubles(); 
DoubleSummaryStatistics stats = doubles.stream().collect(Collectors.summarizingDouble(Double::doubleValue)); 
System.out.println(stats.getAverage()); 
System.out.println(stats.getSum()); 

これはsummarizingDoubleコレクタに流れを収集することによって得られます。このコレクタは引数としてToDoubleFunctionをとります。これは、解析するためにdoubleを返さなければならない関数です。

Integer,LongおよびDoubleの統計値を得ることができます。異なる返すことができ

List<Double> doubles = getListOfDoubles(); 
DoubleStream stream = doubles.stream().mapToDouble(Double::doubleValue); 
1

(たとえそれが大幅に短くないですが、...):

double sum = doubles.stream().collect(Collectors.summingDouble(x -> x)); 

または

double sum = DoubleStream.of(doubles.stream().mapToDouble(x->x).toArray()).sum(); 

が、後者は、あなたのアプローチとほぼ同じです。

+2

本当にありません。ストリーム全体を中間配列に格納することは、ここに示す他のすべてのソリューションよりも利点がないリソースの無駄です。 – Holger

関連する問題