package patternmatching; import java.util.Arrays; import java.util.stream.Collectors; public final class Statistics { private final long[] data; private Double mean = null; private Double variance = null; private Statistics(long[] data) { this.data = data; } private double getMean() { if (mean == null) { mean = (double) Arrays.stream(data).sum() / data.length; } return mean; } private double getVariance() { if (variance == null) { final double mean = getMean(); double temp = 0; for(double a : data) { temp += (a-mean)*(a-mean); } variance = temp/(data.length-1); } return variance; } private double getStddev() { return Math.sqrt(getVariance()); } private double getMedian() { Arrays.sort(data); if (data.length % 2 == 0) return (data[(data.length / 2) - 1] + data[data.length / 2]) / 2.0; return data[data.length / 2]; } static Statistics from(long[] data) { return new Statistics(data); } @Override public String toString() { return String.format( "mean=%.2fms stddev=%.2fms median=%.2fms", getMean()/1000, getStddev()/1000, getMedian()/1000 ); } String asCSv() { return Arrays.stream(data) .mapToObj(String::valueOf) .collect(Collectors.joining(",")); } }