将double[]转为List<Float>时Stream映射类型转换疑问
为什么(double)v强制转换后仍无法得到List?
核心原因是原始类型流(DoubleStream)的map方法和引用类型流(Stream
两种写法的流类型拆解:
代码示例1(可行):
List<Float> collect = Arrays.stream(vec).boxed().map(v -> v.floatValue()).collect(Collectors.toList());
Arrays.stream(double[])返回 DoubleStream(原始double类型的流)。boxed()将DoubleStream转换为Stream<Double>(引用类型流,元素为包装类Double)。- 此时调用的是
Stream<Double>的map方法,它接受Function<Double, Float>:v.floatValue()返回基本类型float,会自动装箱为Float对象,流变为Stream<Float>。 - 最终collect得到
List<Float>,符合类型要求。
代码示例2(报错):
List<Float> collect2 = Arrays.stream(vec).map(v -> (float) v).boxed().collect(Collectors.toList());
Arrays.stream(double[])返回 DoubleStream。- 这里调用的是
DoubleStream的map方法,它要求参数是DoubleUnaryOperator——这个函数接收double,必须返回double。 (float)v虽然把double转成了float,但由于方法返回类型要求是double,这个float会被自动提升为double(基本类型隐式转换),流仍然是DoubleStream。- 后续
boxed()将DoubleStream转为Stream<Double>,collect后得到List<Double>,和声明的List<Float>类型不匹配,因此编译器报错。
修正代码示例2的两种方式:
如果想在原始流阶段完成转换,可选择:
- 用
mapToObj直接生成Float对象流:
List<Float> collect2 = Arrays.stream(vec) .mapToObj(v -> (float) v) .collect(Collectors.toList());
- 用
mapToFloat转成FloatStream再装箱:
List<Float> collect2 = Arrays.stream(vec) .mapToFloat(v -> (float) v) .boxed() .collect(Collectors.toList());
内容的提问来源于stack exchange,提问作者Tiina
相关产品推荐
相关产品推荐

