将Java字符串流转换为float数组

时间:2018-06-22 16:42:35

标签: java arrays java-stream

我正在尝试找到一种优雅的方法来将Java 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[],我对此并不了解。

我在做什么错了?

4 个答案:

答案 0 :(得分:2)

您的代码中有一个小错误,我们将首先修复该错误,以揭示手头的较大问题:

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

即使看起来好像不是,您的问题也将泛化。让我们看一下definition of 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

This question and its answer提供了将String流转换为float[]的问题的解决方案/解决方法。

答案 1 :(得分:1)

还没有办法直接从Java中的任何Stream获取float[]。仅有3种可用的转换机制转换为数字Stream接口:

因此,唯一的方法是改为使用double,这很容易:

double[] data = input.mapToDouble(Double::parseDouble).toArray();

如果您坚持要从float[]获得double[],那么这可能是另一个有助于Guava库的问题:

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

或简单的for-loop

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

或者,您可以使用方法toArray(IntFunction<A[]> generator)返回对象类型的数组。但是,要取消对Float的装箱,您必须以相同的方式再次使用for循环-尽管没有任何区别,但您可以直接使用Float[]进行装箱。

用途:

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

答案 2 :(得分: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();
}

答案 3 :(得分:0)

我的图书馆AbacusUtil有更好的方法:

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