tream 接口是在 Java 8 中引入的棠笑,它支持并行執(zhí)行镜悉。Stream 接口支持排序祟辟、映射、過濾侣肄、歸約模式并輕松執(zhí)行旧困,為函數(shù)式編程奠定了基礎(chǔ)(連同 lambda)。出于性能原因稼锅,還有相應(yīng)的原始流(IntStream吼具,DoubleStream和LongStream)。
在本文中矩距,我們將研究如何使用流 API 和集合執(zhí)行基本統(tǒng)計(jì)信息拗盒,例如最大值、最小值锥债、平均值(平均值)和發(fā)生次數(shù)陡蝇,以用于數(shù)據(jù)表示目的。我們的方法是使用流 API (java.util.stream) 中的一個(gè)類和包java.util中提供的集合和統(tǒng)計(jì)信息實(shí)用程序創(chuàng)建值哮肚,稱為DoubleSummaryStatistics(您還可以探索 IntSummaryStatistics 和LongSummaryStatistics以使用它們執(zhí)行基本統(tǒng)計(jì)信息)登夫。
假設(shè)我們有一組數(shù)據(jù),我們將使用DoubleStream(流 API)來整理绽左、排序或過濾我們的數(shù)據(jù)悼嫉,并使用summaryStatistics方法來獲取最大值艇潭、最小值拼窥、平均值、計(jì)數(shù)和數(shù)據(jù)的總和蹋凝。
我們將使用集合的頻率方法來獲取數(shù)據(jù)集中值的出現(xiàn)次數(shù)鲁纠,該值可用于形成以直方圖表示的基礎(chǔ)。
讓我們開始編碼鳍寂,看看它的實(shí)際效果改含。
package com.habeebcycle;
importjava.util.stream.*;
importjava.util.*;
publicclassBasicStats{
? ? public static void main (String[] args) {
? ? ? //Datasetasfollows
? ? ? double dataset[]={32,23,54,15.2,26.3,7.1,18.7,14.2,23,
? ? ? 25,21.7,12.4,21,24,42,55,23,14.5,21.3,26.3,53,23,
? ? ? 15.2,7.1,15.4,23,15.2,14.2,14.2,25,18.7,15.2,14.5};
? ? ? //Getthe basic statistics
? ? ? DoubleSummaryStatistics stats=
? ? ? DoubleStream.of(dataset).summaryStatistics();
? ? ? //Now stats variable has our basic stats
? ? ? //Let's get the total values in our dataset
? ? ? ? System.out.println (stats.getCount()); //Gives 33;
? ? ? ? //Let'sgetthesum
? ? ? System.out.println (stats.getSum());//Gives753.4
? ? ? //Let's get the mean (average)
? ? ? ? System.out.println (stats.getAverage()); //Gives 22.83
? ? ? ? //Let'sgetthe maximum
? ? ? System.out.println (stats.getMax());//Gives55.0
? ? ? //Let's get the maximum
? ? ? ? System.out.println (stats.getMin()); //Gives 7.10
? ? }
}
我們可以結(jié)合統(tǒng)計(jì)結(jié)果,通過使
stats.combine(DoubleSummaryStatistics otherStats);
為了將數(shù)據(jù)集作為表示方法迄汛,我們將使用流的boxed()方法捍壤,以便collect方法可以與Collectors類一起使用。
Collectors類有一個(gè)名為groupingBy的方法鞍爱,它可用于通過計(jì)算數(shù)據(jù)集中每個(gè)值的出現(xiàn)次數(shù)將我們的數(shù)據(jù)集分組為不同的集合鹃觉。
Map<Double, Long>histogram=
DoubleStream.of(dataset)
? .boxed()
? .collect(Collectors.groupingBy(
? ? ? e ->e,
? ? ? Collectors.counting()
? ));
Collectors類有一個(gè)名為groupingBy的方法,它可用于通過計(jì)算數(shù)據(jù)集中每個(gè)值的出現(xiàn)次數(shù)將我們的數(shù)據(jù)集分組為不同的集合
Map<Double, Long>histogram=
DoubleStream.of(dataset)
? .boxed()
? .collect(Collectors.groupingBy(
? ? ? e ->e,
? ? ? Collectors.counting()
? ));
Collectors現(xiàn)在將每個(gè)數(shù)據(jù)及其出現(xiàn)次數(shù)作為鍵值映射睹逃。我們可以使用我們的自定義方法使用星星打印出Collectors盗扇。
for(Doubledata: histogram.keySet()){
? System.out.println (
? ? data+" : "+histogram.get(data)+" : "+getStars(histogram.get(data))
? );
}
其中getStars方法定義如下:
publicstaticStringgetStars(longnumber){
? Stringoutput="";
? for(int i=1; i<=number; i++){
? ? ? output+=" * ";
? }
? returnoutput;
}
輸出
32.0:1:*
18.7:2:**
15.4:1:*
42.0:1:*
12.4:1:*
21.7:1:*
15.2:4:****
53.0:1:*
14.2:3:***
55.0:1:*
54.0:1:*
14.5:2:**
21.0:1:*
26.3:2:**
23.0:5:*****
21.3:1:*
24.0:1:*
25.0:2:**
7.1:2:**
流 API 與集合實(shí)用程序相結(jié)合祷肯,功能強(qiáng)大,具有一組用于處理數(shù)據(jù)集的簡單工具疗隶。它使我們能夠減少大量的樣板代碼佑笋,創(chuàng)建更具可讀性的程序,并在正確使用時(shí)提高應(yīng)用程序的生產(chǎn)力斑鼻。