1540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera/* 2540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved. 3540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * 5540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * This code is free software; you can redistribute it and/or modify it 6540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * under the terms of the GNU General Public License version 2 only, as 7540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * published by the Free Software Foundation. Oracle designates this 8540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * particular file as subject to the "Classpath" exception as provided 9540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * by Oracle in the LICENSE file that accompanied this code. 10540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * 11540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * This code is distributed in the hope that it will be useful, but WITHOUT 12540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * version 2 for more details (a copy is included in the LICENSE file that 15540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * accompanied this code). 16540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * 17540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * You should have received a copy of the GNU General Public License version 18540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * 2 along with this work; if not, write to the Free Software Foundation, 19540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * 21540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * or visit www.oracle.com if you need additional information or have any 23540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * questions. 24540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera */ 25540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmerapackage java.util; 26540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera 27540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmeraimport java.util.function.DoubleConsumer; 28540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera 29540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera/** 30540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * A state object for collecting statistics such as count, min, max, sum, and 31540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * average. 32540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * 33540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * <p>This class is designed to work with (though does not require) 3491bae3c5d9142b9cb2877736523bbf0c9385b209Shubham Ajmera * {@linkplain java.util.stream streams}. For example, you can compute 35540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * summary statistics on a stream of doubles with: 36540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * <pre> {@code 37540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * DoubleSummaryStatistics stats = doubleStream.collect(DoubleSummaryStatistics::new, 38540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * DoubleSummaryStatistics::accept, 39540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * DoubleSummaryStatistics::combine); 40540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * }</pre> 41540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * 42540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * <p>{@code DoubleSummaryStatistics} can be used as a 4391bae3c5d9142b9cb2877736523bbf0c9385b209Shubham Ajmera * {@linkplain java.util.stream.Stream#collect(Collector) reduction} 4491bae3c5d9142b9cb2877736523bbf0c9385b209Shubham Ajmera * target for a {@linkplain java.util.stream.Stream stream}. For example: 45540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * 46540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * <pre> {@code 47540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * DoubleSummaryStatistics stats = people.stream() 48540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * .collect(Collectors.summarizingDouble(Person::getWeight)); 49540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera *}</pre> 50540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * 51540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * This computes, in a single pass, the count of people, as well as the minimum, 52540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * maximum, sum, and average of their weights. 53540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * 54540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * @implNote This implementation is not thread safe. However, it is safe to use 5591bae3c5d9142b9cb2877736523bbf0c9385b209Shubham Ajmera * {@link java.util.stream.Collectors#summarizingDouble(java.util.function.ToDoubleFunction) 56540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * Collectors.toDoubleStatistics()} on a parallel stream, because the parallel 5791bae3c5d9142b9cb2877736523bbf0c9385b209Shubham Ajmera * implementation of {@link java.util.stream.Stream#collect Stream.collect()} 58540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * provides the necessary partitioning, isolation, and merging of results for 59540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * safe and efficient parallel execution. 60540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * @since 1.8 61540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera */ 62540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmerapublic class DoubleSummaryStatistics implements DoubleConsumer { 63540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera private long count; 64540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera private double sum; 65540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera private double sumCompensation; // Low order bits of sum 66540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera private double simpleSum; // Used to compute right sum for non-finite inputs 67540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera private double min = Double.POSITIVE_INFINITY; 68540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera private double max = Double.NEGATIVE_INFINITY; 69540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera 70540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera /** 71540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * Construct an empty instance with zero count, zero sum, 72540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * {@code Double.POSITIVE_INFINITY} min, {@code Double.NEGATIVE_INFINITY} 73540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * max and zero average. 74540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera */ 75540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera public DoubleSummaryStatistics() { } 76540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera 77540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera /** 78540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * Records another value into the summary information. 79540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * 80540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * @param value the input value 81540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera */ 82540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera @Override 83540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera public void accept(double value) { 84540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera ++count; 85540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera simpleSum += value; 86540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera sumWithCompensation(value); 87540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera min = Math.min(min, value); 88540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera max = Math.max(max, value); 89540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera } 90540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera 91540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera /** 92540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * Combines the state of another {@code DoubleSummaryStatistics} into this 93540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * one. 94540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * 95540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * @param other another {@code DoubleSummaryStatistics} 96540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * @throws NullPointerException if {@code other} is null 97540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera */ 98540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera public void combine(DoubleSummaryStatistics other) { 99540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera count += other.count; 100540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera simpleSum += other.simpleSum; 101540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera sumWithCompensation(other.sum); 102540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera sumWithCompensation(other.sumCompensation); 103540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera min = Math.min(min, other.min); 104540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera max = Math.max(max, other.max); 105540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera } 106540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera 107540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera /** 108540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * Incorporate a new double value using Kahan summation / 109540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * compensated summation. 110540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera */ 111540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera private void sumWithCompensation(double value) { 112540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera double tmp = value - sumCompensation; 113540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera double velvel = sum + tmp; // Little wolf of rounding error 114540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera sumCompensation = (velvel - sum) - tmp; 115540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera sum = velvel; 116540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera } 117540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera 118540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera /** 119540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * Return the count of values recorded. 120540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * 121540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * @return the count of values 122540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera */ 123540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera public final long getCount() { 124540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera return count; 125540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera } 126540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera 127540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera /** 128540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * Returns the sum of values recorded, or zero if no values have been 129540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * recorded. 130540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * 131540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * If any recorded value is a NaN or the sum is at any point a NaN 132540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * then the sum will be NaN. 133540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * 134540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * <p> The value of a floating-point sum is a function both of the 135540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * input values as well as the order of addition operations. The 136540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * order of addition operations of this method is intentionally 137540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * not defined to allow for implementation flexibility to improve 138540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * the speed and accuracy of the computed result. 139540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * 140540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * In particular, this method may be implemented using compensated 141540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * summation or other technique to reduce the error bound in the 142540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * numerical sum compared to a simple summation of {@code double} 143540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * values. 144540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * 145540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * @apiNote Values sorted by increasing absolute magnitude tend to yield 146540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * more accurate results. 147540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * 148540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * @return the sum of values, or zero if none 149540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera */ 150540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera public final double getSum() { 151540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera // Better error bounds to add both terms as the final sum 152540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera double tmp = sum + sumCompensation; 153540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera if (Double.isNaN(tmp) && Double.isInfinite(simpleSum)) 154540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera // If the compensated sum is spuriously NaN from 155540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera // accumulating one or more same-signed infinite values, 156540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera // return the correctly-signed infinity stored in 157540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera // simpleSum. 158540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera return simpleSum; 159540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera else 160540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera return tmp; 161540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera } 162540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera 163540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera /** 164540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * Returns the minimum recorded value, {@code Double.NaN} if any recorded 165540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * value was NaN or {@code Double.POSITIVE_INFINITY} if no values were 166540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * recorded. Unlike the numerical comparison operators, this method 167540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * considers negative zero to be strictly smaller than positive zero. 168540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * 169540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * @return the minimum recorded value, {@code Double.NaN} if any recorded 170540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * value was NaN or {@code Double.POSITIVE_INFINITY} if no values were 171540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * recorded 172540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera */ 173540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera public final double getMin() { 174540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera return min; 175540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera } 176540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera 177540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera /** 178540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * Returns the maximum recorded value, {@code Double.NaN} if any recorded 179540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * value was NaN or {@code Double.NEGATIVE_INFINITY} if no values were 180540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * recorded. Unlike the numerical comparison operators, this method 181540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * considers negative zero to be strictly smaller than positive zero. 182540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * 183540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * @return the maximum recorded value, {@code Double.NaN} if any recorded 184540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * value was NaN or {@code Double.NEGATIVE_INFINITY} if no values were 185540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * recorded 186540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera */ 187540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera public final double getMax() { 188540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera return max; 189540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera } 190540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera 191540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera /** 192540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * Returns the arithmetic mean of values recorded, or zero if no 193540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * values have been recorded. 194540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * 195540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * If any recorded value is a NaN or the sum is at any point a NaN 196540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * then the average will be code NaN. 197540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * 198540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * <p>The average returned can vary depending upon the order in 199540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * which values are recorded. 200540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * 201540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * This method may be implemented using compensated summation or 202540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * other technique to reduce the error bound in the {@link #getSum 203540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * numerical sum} used to compute the average. 204540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * 205540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * @apiNote Values sorted by increasing absolute magnitude tend to yield 206540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * more accurate results. 207540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * 208540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * @return the arithmetic mean of values, or zero if none 209540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera */ 210540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera public final double getAverage() { 211540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera return getCount() > 0 ? getSum() / getCount() : 0.0d; 212540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera } 213540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera 214540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera /** 215540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * {@inheritDoc} 216540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * 217540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * Returns a non-empty string representation of this object suitable for 218540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * debugging. The exact presentation format is unspecified and may vary 219540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera * between implementations and versions. 220540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera */ 221540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera @Override 222540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera public String toString() { 223540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera return String.format( 224540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera "%s{count=%d, sum=%f, min=%f, average=%f, max=%f}", 225540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera this.getClass().getSimpleName(), 226540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera getCount(), 227540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera getSum(), 228540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera getMin(), 229540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera getAverage(), 230540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera getMax()); 231540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera } 232540dfe93cdbe35432f3f975729c8e55e80f4e767Shubham Ajmera} 233