我正在尝试使用Java 8 lambda演算将double[]
转换为float[]
。到目前为止,我刚刚创建了一个应该修改的玩具方法。试图找到转换原始数组的帮助。大多数情况下,是否有任何方法可以摆脱番石榴转换,因为转换为List和返回对于大型数组来说太重了。
import com.google.common.primitives.Floats;
public static float[] doubleToFloat(double[] vector) {
Float[] f = Arrays.stream(vector).<Float>mapToObj(x -> (float) x).toArray(Float[]::new);
return Floats.toArray(Arrays.asList(f));
}
答案 0 :(得分:7)
没有专门的FloatStream
,因此您不希望使用Streams API。
如果您希望获得float
(double
的一半内存)的好处并且仍然使用流,则必须存储以整数编码的浮点数:
double[] doubles = new double[]{1.2, 3.5, 4};
int[] floatsAsInts = Arrays.stream(doubles)
.mapToInt(d -> Float.floatToRawIntBits((float) d))
.toArray();
Arrays.stream(floatsAsInts)
.forEach(i -> System.out.println(Float.intBitsToFloat(i)));
你必须有一个非常好的理由来折磨你自己。除非你打算在这个数组中存储一亿个数字,否则你最好只使用double []。
答案 1 :(得分:4)
您仍然可以使用IntStream
作为双数组的循环器。
public static float[] doubleToFloat(double[] vector) {
float[] f = new float[vector.length];
IntStream.range(0, f.length).forEach(i -> f[i] = (float) vector[i]);
return f;
}
是的,这不是一个单行,并且在某种程度上类似于传统的循环,但Stream API并不总是替代。 for循环在很大程度上可以完成这项工作。