我正在尝试找到一种优雅的方法来将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[]
,我对此并不了解。
我在做什么错了?
答案 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接口:
mapToInt(ToIntFunction<? super T> mapper)
-> IntStream
mapToLong(ToLongFunction<? super T> mapper)
-> LongStream
mapToDouble(ToDoubleFunction<? super T> mapper)
-> DoubleStream
因此,唯一的方法是改为使用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();