如何使用Java8流将浮点数组列表转换为基本浮点数组?
我正在尝试使用Java8流API将包含如何使用Java8流将浮点数组列表转换为基本浮点数组?,java,arrays,arraylist,java-8,Java,Arrays,Arraylist,Java 8,我正在尝试使用Java8流API将包含float值的ArrayList转换为一个基本浮点数组。 到目前为止,我尝试的是这样的: List<Float> floatList = new ArrayList<Float>(); float[] floatArray = floatList.stream().map(i -> i).toArray(float[]::new) List floatList=new ArrayList(); float[]floatArr
float
值的ArrayList
转换为一个基本浮点数组。
到目前为止,我尝试的是这样的:
List<Float> floatList = new ArrayList<Float>();
float[] floatArray = floatList.stream().map(i -> i).toArray(float[]::new)
List floatList=new ArrayList();
float[]floatArray=floatList.stream().map(i->i).toArray(float[]::新建)
无法将对象[]
转换为基本数组(float[]
)
另一种可能的方法(假设非null
值)为:
Object[] arr = floatList.toArray();
for (Object o : arr) {
System.out.println((float)o);
}
apache的Commons为它提供了一个util,不过老实说:没有好的内置方法来处理流。对不起,这是事实 如果您可以使用
double[]
,您可以使用floatList.stream().mapToDouble(f->f.doubleValue()).toArray()
,但这可能不是您所希望的
如果您想使用streams,您需要编写自己的自定义大小调整列表类型并收集到它,但除此之外,任何东西都不会起作用。你得写些像这样的东西
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[] result = floatList.stream().collect(
()-> FloatBuffer.allocate(floatList.size()),
FloatBuffer::put,
(left, right) -> {
throw new UnsupportedOperationException("only be called in parallel stream");
}
).array();
如果与流
收集
方法一起使用,则可以完成此操作
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();
如果使用内置基元集合,只需将浮点列表
转换为浮点数组,如下所示:
float[] array = FloatLists.mutable.with(1.0f, 2.0f, 3.0f).toArray();
注意:我是Eclipse集合的提交者。那么问题是什么呢?如果一个
double[]
就足够了,你可以使用floatList.stream().mapToDouble(f->f.doubleValue()).toArray()代码>float
是一种古老的类型。因为他们没有添加FloatStream
,只有a,你只能通过编写自己的来实现。不是dup,而是相关的:你不能将对象[]
强制转换为float[]
它会抛出ClassCastException
我的意思是,这在流中是可能的,只是int[]
、长[]
和双[]
。您必须编写floatList.toArray(newfloat[0])
,您不能执行该转换。
float[] array =
LazyIterate.adapt(floats).collectFloat(Float::floatValue).toArray();
float[] array = FloatLists.mutable.with(1.0f, 2.0f, 3.0f).toArray();