在这个页面上,我们将提供 java 8汇总统计的例子。

我们可以一次性计算所有的统计信息,如计数、最小、最大、总和和平均数。

Java 8为double数据类型提供DoubleSummaryStatistics,为integer数据类型提供IntSummaryStatistics,为long数据类型提供LongSummaryStatistics

这些类与元素流一起工作。

汇总统计方法

找到汇总统计的方法。这些方法属于java 8的汇总统计类。
getAverage(): 它返回所有接受值的平均值。
getCount(): 它计算所有元素的总数。
getMax(): 它返回最大值。
getMin(): 它返回最小值。
getSum(): 它返回所有元素的总和。
accept(): 它将元素添加到汇总信息中。
combine(): 它结合了两个汇总统计。

DoubleSummaryStatistics 和 Collectors.summarizingDouble()

DoubleSummaryStatistics收集double数据类型流的统计信息。Collectors.sumplizingDouble()接受double映射函数并返回double汇总统计的收集器(Collector)。


DoubleSummaryStatistics dstats = list.stream()
	     .collect(Collectors.summarizingDouble(Rectangle::getWidth)); 

IntSummaryStatistics 和 Collectors.summarizingInt()

IntSummaryStatistics收集了int数据类型流的统计信息。Collectors.summaryizingInt()接受int的映射函数,并返回integer汇总统计的收集器(Collector)。

IntSummaryStatistics istats = list.stream()
	     .collect(Collectors.summarizingInt(Rectangle::getLength)); 

LongSummaryStatistics 和 Collectors.summarizingLong()

LongSummaryStatistics收集了long数据类型流的统计信息。Collectors.summarizingLong()接受long的映射函数,并返回long汇总统计的收集器(Collector)。

LongSummaryStatistics lstats = list.stream().
	         collect(Collectors.summarizingLong(Rectangle::getId)); 

基本数据类型的汇总统计示例

SummaryStatisticsWithPrimitiveDataType.java

import java.util.DoubleSummaryStatistics;
import java.util.IntSummaryStatistics;
import java.util.LongSummaryStatistics;
import java.util.stream.DoubleStream;
import java.util.stream.IntStream;
import java.util.stream.LongStream;
public class SummaryStatisticsWithPrimitiveDataType {
	public static void main(String[] args) {
		System.out.println("---DoubleSummaryStatistics---");		
		DoubleSummaryStatistics dstats = DoubleStream.of(5.33d,2.34d,5.32d,2.31d,3.51d).
				collect(DoubleSummaryStatistics::new, DoubleSummaryStatistics::accept, 
						DoubleSummaryStatistics::combine);
		System.out.println("Max:"+dstats.getMax()+", Min:"+dstats.getMin());
		System.out.println("Count:"+dstats.getCount()+", Sum:"+dstats.getSum());
		System.out.println("Average:"+dstats.getAverage());		
		
		System.out.println("---LongSummaryStatistics---");			
		LongSummaryStatistics lstats = LongStream.of(51l,23l,53l,23l,35l).
				collect(LongSummaryStatistics::new, LongSummaryStatistics::accept, 
						LongSummaryStatistics::combine);
		System.out.println("Max:"+lstats.getMax()+", Min:"+lstats.getMin());
		System.out.println("Count:"+lstats.getCount()+", Sum:"+lstats.getSum());
		System.out.println("Average:"+lstats.getAverage());		
		
		System.out.println("---IntSummaryStatistics---");			
		IntSummaryStatistics istats = IntStream.of(51,22,50,27,35).
				collect(IntSummaryStatistics::new, IntSummaryStatistics::accept, 
						IntSummaryStatistics::combine);
		System.out.println("Max:"+istats.getMax()+", Min:"+istats.getMin());
		System.out.println("Count:"+istats.getCount()+", Sum:"+istats.getSum());
		System.out.println("Average:"+istats.getAverage());		
	}
} 

输出

---DoubleSummaryStatistics---
Max:5.33, Min:2.31
Count:5, Sum:18.81
Average:3.7619999999999996
---LongSummaryStatistics---
Max:53, Min:23
Count:5, Sum:185
Average:37.0
---IntSummaryStatistics---
Max:51, Min:22
Count:5, Sum:185
Average:37.0 

对象的汇总统计示例

SummaryStatisticsDemoWithObject.java

import java.util.DoubleSummaryStatistics;
import java.util.IntSummaryStatistics;
import java.util.List;
import java.util.LongSummaryStatistics;
import java.util.stream.Collectors;
public class SummaryStatisticsDemoWithObject {
	public static void main(String[] args) {
		System.out.println("--DoubleSummaryStatistics--");
		List<Rectangle> list = Rectangle.getRectangle();
		DoubleSummaryStatistics dstats = list.stream()
			     .collect(Collectors.summarizingDouble(Rectangle::getWidth));
		System.out.println("Max:"+dstats.getMax()+", Min:"+dstats.getMin());
		System.out.println("Count:"+dstats.getCount()+", Sum:"+dstats.getSum());
		System.out.println("Average:"+dstats.getAverage());
		
		System.out.println("--IntSummaryStatistics--");
		list = Rectangle.getRectangle();
		IntSummaryStatistics istats = list.stream()
			     .collect(Collectors.summarizingInt(Rectangle::getLength));
		System.out.println("Max:"+istats.getMax()+", Min:"+istats.getMin());
		System.out.println("Count:"+istats.getCount()+", Sum:"+istats.getSum());
		System.out.println("Average:"+istats.getAverage());
		
		System.out.println("--LongSummaryStatistics--");
		list = Rectangle.getRectangle();
		LongSummaryStatistics lstats = list.stream().
				         collect(Collectors.summarizingLong(Rectangle::getId));
		System.out.println("Max:"+lstats.getMax()+", Min:"+lstats.getMin());
		System.out.println("Count:"+lstats.getCount()+", Sum:"+lstats.getSum());
		System.out.println("Average:"+lstats.getAverage());
	}
} 

Rectangle.java

import java.util.ArrayList;
import java.util.List;
public class Rectangle {
	private long id;
	private int length;
	private double width;
	public Rectangle(long id, int length, double width) {
		this.id = id;
		this.length = length;
		this.width = width;
	}
	public long getId() {
		return id;
	}
	public int getLength() {
		return length;
	}
	public double getWidth() {
		return width;
	}
        public static List<Rectangle> getRectangle() {
    	    List<Rectangle> list = new ArrayList<>();
    	    list.add(new Rectangle(100l, 213, 114.23d));
    	    list.add(new Rectangle(200l, 233, 134.34d));
    	    list.add(new Rectangle(300l, 243, 144.32d));
    	    list.add(new Rectangle(400l, 253, 154.12d));
	    return list;
        }
} 

输出

--DoubleSummaryStatistics--
Max:154.12, Min:114.23
Count:4, Sum:547.01
Average:136.7525
--IntSummaryStatistics--
Max:253, Min:213
Count:4, Sum:942
Average:235.5
--LongSummaryStatistics--
Max:400, Min:100
Count:4, Sum:1000
Average:250.0 

参考文献

【1】Java 8 Summary Statistics Example

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐