tream 接口是在 Java 8 中引入的,它支持并行执行。Stream 接口支持排序、映射、过滤、归约模式并轻松执行,为函数式编程奠定了基础(连同 lambda)。出于性能原因,还有相应的原始流(IntStream,DoubleStream和LongStream)。
在本文中,我们将研究如何使用流 API 和集合执行基本统计信息,例如最大值、最小值、平均值(平均值)和发生次数,以用于数据表示目的。我们的方法是使用流 API (java.util.stream) 中的一个类和包java.util中提供的集合和统计信息实用程序创建值,称为DoubleSummaryStatistics(您还可以探索 IntSummaryStatistics 和LongSummaryStatistics以使用它们执行基本统计信息)。
假设我们有一组数据,我们将使用DoubleStream(流 API)来整理、排序或过滤我们的数据,并使用summaryStatistics方法来获取最大值、最小值、平均值、计数和数据的总和。
我们将使用集合的频率方法来获取数据集中值的出现次数,该值可用于形成以直方图表示的基础。
让我们开始编码,看看它的实际效果。
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
}
}
我们可以结合统计结果,通过使
stats.combine(DoubleSummaryStatistics otherStats);
为了将数据集作为表示方法,我们将使用流的boxed()方法,以便collect方法可以与Collectors类一起使用。
Collectors类有一个名为groupingBy的方法,它可用于通过计算数据集中每个值的出现次数将我们的数据集分组为不同的集合。
Map<Double, Long>histogram=
DoubleStream.of(dataset)
.boxed()
.collect(Collectors.groupingBy(
e ->e,
Collectors.counting()
));
Collectors类有一个名为groupingBy的方法,它可用于通过计算数据集中每个值的出现次数将我们的数据集分组为不同的集合
Map<Double, Long>histogram=
DoubleStream.of(dataset)
.boxed()
.collect(Collectors.groupingBy(
e ->e,
Collectors.counting()
));
Collectors现在将每个数据及其出现次数作为键值映射。我们可以使用我们的自定义方法使用星星打印出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 与集合实用程序相结合,功能强大,具有一组用于处理数据集的简单工具。它使我们能够减少大量的样板代码,创建更具可读性的程序,并在正确使用时提高应用程序的生产力。