As far as I can tell, the way to sum a List using Java 8 streams is this:
List vals = . . . ;
double sum = vals.stre
To me, the
mapToDouble(Double::doubleValue)seems [what] lambdas and streams were supposed to dispense with.
The need to use mapToDouble is a consequence of a decision to implement generics via type erasure, essentially closing the door on any possibility of using primitives inside generics. It is that same decision that made it necessary to create the DoubleStream, IntStream, and LongStream family of classes - to provide a stream-based unboxing.
Is there some way to squeeze autoboxing in to make this shorter? Or is this just the current state of the art?
Unfortunately, not at this time: although it is theoretically possible for the compiler to figure out that Stream can be converted to DoubleStream implicitly, in the same way that the primitives are unboxed, this has not been done.
As far as your array-based solution goes, it is the most efficient of the three. However, it is not as flexible as the other two: the one with mapToDouble lets you sum any attribute of a custom class, while the last one lets you perform other types of aggregation.
reduce(....)is so much longer thansum()
I agree, this approach is worse than mapToDouble in terms of readability.