src/share/classes/java/util/stream/Collectors.java

Print this page

        

*** 504,519 **** * @return a {@code Collector} that produces the sum of a derived property */ public static <T> Collector<T, ?, Double> summingDouble(ToDoubleFunction<? super T> mapper) { return new CollectorImpl<>( ! () -> new double[1], ! (a, t) -> { a[0] += mapper.applyAsDouble(t); }, ! (a, b) -> { a[0] += b[0]; return a; }, ! a -> a[0], CH_NOID); } /** * Returns a {@code Collector} that produces the arithmetic mean of an integer-valued * function applied to the input elements. If no elements are present, * the result is 0. * --- 504,541 ---- * @return a {@code Collector} that produces the sum of a derived property */ public static <T> Collector<T, ?, Double> summingDouble(ToDoubleFunction<? super T> mapper) { return new CollectorImpl<>( ! () -> new double[2], ! (a, t) -> { sumWithCompensation(a, mapper.applyAsDouble(t)); }, ! (a, b) -> { sumWithCompensation(a, b[0]); return sumWithCompensation(a, b[1]); }, ! a -> a[0], ! CH_NOID); ! } ! ! /** ! * Incorporate a new double value using Kahan summation / ! * compensation summation. ! * ! * High-order bits of the sum are in intermediateSum[0], low-order ! * bits of the sum are in intermediateSum[1], any additional ! * elements are application-specific. ! * ! * @param intermediateSum the high-order and low-order words of the intermediate sum ! * @param value the name value to be included in the running sum ! */ ! static double[] sumWithCompensation(double[] intermediateSum, double value) { ! double tmp = value - intermediateSum[1]; ! double sum = intermediateSum[0]; ! double velvel = sum + tmp; // Little wolf of rounding error ! intermediateSum[1] = (velvel - sum) - tmp; ! intermediateSum[0] = velvel; ! return intermediateSum; } + /** * Returns a {@code Collector} that produces the arithmetic mean of an integer-valued * function applied to the input elements. If no elements are present, * the result is 0. *
*** 565,578 **** * @return a {@code Collector} that produces the sum of a derived property */ public static <T> Collector<T, ?, Double> averagingDouble(ToDoubleFunction<? super T> mapper) { return new CollectorImpl<>( ! () -> new double[2], ! (a, t) -> { a[0] += mapper.applyAsDouble(t); a[1]++; }, ! (a, b) -> { a[0] += b[0]; a[1] += b[1]; return a; }, ! a -> (a[1] == 0) ? 0.0d : a[0] / a[1], CH_NOID); } /** * Returns a {@code Collector} which performs a reduction of its * input elements under a specified {@code BinaryOperator} using the --- 587,601 ---- * @return a {@code Collector} that produces the sum of a derived property */ public static <T> Collector<T, ?, Double> averagingDouble(ToDoubleFunction<? super T> mapper) { return new CollectorImpl<>( ! () -> new double[3], ! (a, t) -> { sumWithCompensation(a, mapper.applyAsDouble(t)); a[2]++; }, ! (a, b) -> { sumWithCompensation(a, b[0]); sumWithCompensation(a, b[1]); a[2] += b[2]; return a; }, ! a -> (a[2] == 0) ? 0.0d : (a[0] / a[2]), ! CH_NOID); } /** * Returns a {@code Collector} which performs a reduction of its * input elements under a specified {@code BinaryOperator} using the