2 回答
TA贡献1831条经验 获得超4个赞
您的代码中有一个小错误,我们将首先修复该错误,以揭示手头的较大问题:
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(这是通过类型推断完成的,这就是为什么在代码中看不到通用参数的原因)。编译器现在抱怨:
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
该问题及其答案为将a- Stringstream转换为a的问题提供了解决方案/解决方法float[]。
TA贡献1844条经验 获得超8个赞
有没有办法获得的float[]
直接从Java中任何尚未流。数字流接口只有3种可用的转换机制:
因此,唯一的方法是使用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)返回Object类型数组的方法。但是,要取消装箱Float,您必须以相同的方式再次使用for循环-Float[]尽管可以装箱,但除了可以直接使用外,它没有任何区别。
map(Function<? super T,? extends R> mapper) -> Stream<R>
这里是用途:
Float[] data = input.map(Float::valueOf).toArray(Float[]::new);
添加回答
举报