原始数组上的Lambda

时间:2014-12-16 04:13:12

标签: java lambda java-8

我正在尝试使用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));
}

2 个答案:

答案 0 :(得分:7)

没有专门的FloatStream,因此您不希望使用Streams API。

如果您希望获得floatdouble的一半内存)的好处并且仍然使用流,则必须存储以整数编码的浮点数:

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循环在很大程度上可以完成这项工作。