【问题标题】:How to collect DoubleStream to List如何将 DoubleStream 收集到列表
【发布时间】:2016-01-04 19:35:13
【问题描述】:

我有以下代码:

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

我想回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)

如何解决这个问题?

【问题讨论】:

  • 为什么要使用mapToDouble 是不是想直接把它收集到一个列表中?只需使用map。你想做转换String -&gt; Double -&gt; double -&gt; DoubleString -&gt; Double 就足够了。
  • 有什么奇怪的?你提供了一个函数String -&gt; Double,如果你想把它收集到一个List,它必须是一个Double
  • Alexis C. DoubleStream 原始流吗?

标签: java java-8 java-stream collect


【解决方案1】:

您可以使用boxed()。这会将DoubleStream(原始双精度流,由mapToDouble 返回)映射到Stream&lt;Double&gt;

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

请注意,我将Double::valueOf 更改为Double::parseDouble:这可以防止Double.valueOf 返回的Double 被拆箱为原语double

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

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

【讨论】:

  • ...对于可能更大的流,我推荐Pattern.compile(",").splitAsStream("1,2,3,4,…"),因为它不需要填充数组来创建流。
  • @Holger,另一方面,.split(",") 是一条快速路径,它根本不创建正则表达式对象和Matcher。目前尚不清楚splitAsStream 将在哪些令牌数量上优于String.split...
  • @Tagir Valeev:通常情况下,您并不确切知道“大量”阈值。但很明显,随着生成的子字符串数量的增加,您可以忽略单个模式/匹配器对象的开销。
  • 嗯,你为什么不使用Stream.of(1,2,3,4)并完全跳过拆分?
  • @Louis Wasserman:由于结果被收集到List 中,使用Arrays.asList(1,2,3,4) 会更简单,省略整个流内容。但是,对于这个流问题,它不再是有用的示例代码了。除此之外,Stream.of(1,2,3,4) 并没有你想象的那么高效。由于它是一个可变参数方法调用,因此生成的代码会在调用 Stream.of 之前创建并填充一个数组。相比之下,"1,2,3,4" 是由单个指令加载的常量,并且拆分发生在 JRE 库代码中……
猜你喜欢
  • 1970-01-01
  • 2011-02-20
  • 2021-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多