如何收集DoubleStream到列表

gst*_*low 12 java collect java-8 java-stream

我有以下代码:

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

我想回来List<Double>.

此代码无法编译.

我看到错误:

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)
Run Code Online (Sandbox Code Playgroud)

如何解决这个问题?

Tun*_*aki 26

你可以用boxed().这将a DoubleStream(原始双精度流,返回者mapToDouble)映射到a Stream<Double>.

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

请注意,我更改Double::valueOfDouble::parseDouble:这可以防止Double返回的by Double.valueOf取消装入基元double.

但是你为什么mapToDouble要开始使用?你可以map像这样使用:

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

  • ...对于可能更大的流,我建议使用`Pattern.compile(",").splitAsStream("1,2,3,4,...")`因为它不需要填充数组来创建流. (4认同)
  • 另一方面,@ .Holger` .split(",")`是一个快速路径,根本不会创建正则表达式对象和"匹配器".目前还不是很清楚`splitAsStream`的数量会超过`String.split` ... (2认同)