将Java字符串流转换为浮点数数组

4
我希望找到一种优雅的方式将 Stream<String> 转换为 float[]
目前我想出了以下方法:
Float[] data = input.map(Float::valueOf).toArray(Float[]::new);

但是实际上我需要一个float[],当我尝试这样做时:
float[] data = input.map(x -> Float.parseFloat(x)).toArray(size -> new float[]);

我遇到了一个错误:无法将 Object[] 转换为 float[],但我并不太明白这个错误的含义。

“input” 流的元素类型是什么? - ernest_k
1
没有“FloatStream”,因此我认为如果不编写自定义收集器将其从“Float”或“double”转换,这是不可能的。 - Radiodef
1
一个 double[] 数组可以吗?如果可以的话,你可以使用 Stream#mapToDouble(...) 方法来获取一个 DoubleStream - Turing85
3
复制品并不是原帖作者想要的。如果有什么区别的话,这篇文章可能是原帖作者需要的内容。但即使如此,这也无法回答为什么它不起作用的问题。我投票支持重新开放。 - Turing85
我认为这不是重复的问题。我已经看过那个答案,但它并没有帮助我解决我的问题。 - Gianluca
显示剩余3条评论
4个回答

4
目前在Java中,没有直接从任何流中获取float[]的方法。但是有3种可用的转换机制可以将其转换为数字流接口: 因此,唯一的方法是使用double,这相当容易:
double[] data = input.mapToDouble(Double::parseDouble).toArray();

如果您坚持要从double[]获得float[],那么可能会帮助使用Guava库:

float[] floatArray = Floats.toArray(Doubles.asList(data));
// You can collect Stream to a Collection and pass directly Floats.toArray(list);

或者一个简单的 for循环

float[] floatArray = new float[data.length];
for (int i = 0 ; i < data.length; i++) {
    floatArray[i] = (float) data[i];
}

另外,您可以使用方法 toArray(IntFunction<A[]> generator) 返回 Object 类型的数组。但是,要取消包装 Float,您必须再次以完全相同的方式使用 for 循环 - 它没有任何区别,只是您可以直接使用 Float[],尽管是封装的。

以下是用法:

Float[] data = input.map(Float::valueOf).toArray(Float[]::new);

3

你的代码存在一个小错误,我们将先修复它,以揭示更大的问题:

float[] data = input.map(x -> Float.parseFloat(x)).toArray(size -> new float[]);

应该是:

float[] data = input.map(x -> Float.parseFloat(x)).toArray(size -> new float[size]);
                                                                             ^this is new

即使看起来不是这样,你的问题与泛型有关。让我们看一下Stream#toArray(...)的定义
public <A> A[] toArray​(IntFunction<A[]> generator)

由于此方法在A中是通用的,因此类型A不能是原始类型。另一方面,您尝试将A设置为float(这是通过type inference完成的,这就是您在代码中看不到通用参数的原因)。编译器现在抱怨:

error: incompatible types: inference variable A has incompatible bounds
    float[] data = input.stream().map(x -> Float.parseFloat(x)).toArray(size -> new float[size]);
                                                                       ^
    equality constraints: float
    upper bounds: Object
  where A is a type-variable:
    A extends Object declared in method <A>toArray(IntFunction<A[]>)
1 error

这个问题及其答案提供了将String-stream转换为float[]的解决方案/解决方法。


缺失的大小实际上是一个打字错误,在代码中我已经得到了它。我不会修复这个问题,否则你的答案将失去意义。谢谢。 - Gianluca

3

使用我的库abacus-common,有更好的方法:

float[] result = Stream.of(input).mapToFloat(Float::parseFloat).toArray();

感谢您做了核心Java库团队无法完成的工作。单精度在任何需要硬件加速的地方都非常方便。 - Akumaburn

0

您可以通过 floatValue() 方法使用 Float 对象的值来创建数组:

Float[] data = input.map(Float::valueOf).toArray(Float[]::new);
float[] primData = new float[data.length];

for(int x = 0; x < data.length; x ++) {
    primData[x] = data[x].floatValue();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接