How to collect DoubleStream to List

gstackoverflow picture gstackoverflow · Oct 7, 2015 · Viewed 11.7k times · Source

I have the following code:

Stream.of("1,2,3,4".split(",")).mapToDouble(Double::valueOf).collect(Collectors.toList());

I want to return List<Double>.

This code doesn't compile.

I see error:

Error:(57, 69) java: method collect in interface java.util.stream.DoubleStream cannot be applied to given types;
  required: java.util.function.Supplier<R>,java.util.function.ObjDoubleConsumer<R>,java.util.function.BiConsumer<R,R>
  found: java.util.stream.Collector<java.lang.Object,capture#1 of ?,java.util.List<java.lang.Object>>
  reason: cannot infer type-variable(s) R
    (actual and formal argument lists differ in length)

How to fix this issue?

Answer

Tunaki picture Tunaki · Oct 7, 2015

You could use boxed(). This maps a DoubleStream (Stream of primitive doubles, as returned by mapToDouble) to a Stream<Double>.

Stream.of("1,2,3,4".split(",")).mapToDouble(Double::parseDouble).boxed().collect(Collectors.toList());

Note that I changed Double::valueOf to Double::parseDouble: this prevents the Double returned by Double.valueOf to be unboxed to the primitive double.

But why are you using mapToDouble to begin with? You could just use map like this:

Stream.of("1,2,3,4".split(",")).map(Double::valueOf).collect(Collectors.toList());