我尝试使用Java 8 Stream API将包含ArrayList
值的float
转换为原始浮点数组。
到目前为止我尝试的东西看起来像这样:
List<Float> floatList = new ArrayList<Float>();
float[] floatArray = floatList.stream().map(i -> i).toArray(float[]::new)
答案 0 :(得分:6)
老实说:用流来做这个没有好的内置方法。对不起,但这是事实。
如果您可以使用double[]
,则可以使用floatList.stream().mapToDouble(f -> f.doubleValue()).toArray()
,但这可能不是您所希望的。
如果你想用流来做,你需要编写自己的自定义大小调整列表类型并收集它,但是没有什么是可行的。你必须写一些像
这样的东西float[] toFloatArray(Collection<Float> collection) {
class FloatArray {
int size;
float[] array;
FloatArray() {
this.size = 0;
this.array = new float[10];
}
void add(float f) {
if (size == array.length) {
array = Arrays.copyOf(array, array.length * 2);
}
array[size++] = f;
}
FloatArray combine(FloatArray other) {
float[] resultArray = new float[array.length + other.array.length];
System.arraycopy(this.array, 0, resultArray, 0, size);
System.arraycopy(other.array, 0, resultArray, size, other.size);
this.array = resultArray;
this.size += other.size;
return this;
}
float[] result() {
return Arrays.copyOf(array, size);
}
}
return collection.stream().collect(
Collector.of(
FloatArray::new, FloatArray::add,
FloatArray::combine, FloatArray::result));
}
将您的收藏集直接转换为没有流的float[]
要简单得多,或者通过简单的循环自行转换为<{p>
float[] result = new float[collection.size()];
int i = 0;
for (Float f : collection) {
result[i++] = f;
}
或与第三方库,例如番石榴Floats.toArray
。
答案 1 :(得分:2)
这个怎么样?您可以使用FloatBuffer来收集float[]
,例如:
float[] result = floatList.stream().collect(
()-> FloatBuffer.allocate(floatList.size()),
FloatBuffer::put,
(left, right) -> {
throw new UnsupportedOperationException("only be called in parallel stream");
}
).array();
答案 2 :(得分:2)
如果您对Stream
collect
方法使用Eclipse Collections Collectors2
,则可以完成此操作。
ArrayList<Float> floats = new ArrayList<>();
floats.add(new Float(1.0f));
floats.add(new Float(2.0f));
floats.add(new Float(3.0f));
float[] floatArray =
floats.stream()
.collect(Collectors2.collectFloat(
Float::floatValue,
FloatLists.mutable::empty))
.toArray();
您也可以使用LazyIterate
类而不使用Streams来完成此操作。
float[] array =
LazyIterate.adapt(floats).collectFloat(Float::floatValue).toArray();
如果您使用内置的原始集合,您可以简单地将FloatList
转换为float数组,如下所示:
float[] array = FloatLists.mutable.with(1.0f, 2.0f, 3.0f).toArray();
注意:我是Eclipse Collections的提交者。
答案 3 :(得分:1)
在您的情况下,无法将Object[]
转换为原始数组(float []
)。
可能的替代方式(假设Nonnull
值)可以是:
Object[] arr = floatList.toArray();
for (Object o : arr) {
System.out.println((float)o);
}
来自apache的Commons为ArrayUtils.toPrimitive()