Лямбда на примитивных массивах

Я пытаюсь преобразовать double[] в float[] с использованием вычисления лямбды Java 8. До сих пор я только что создал игрушечный метод, который следует пересмотреть. Попытка найти помощь для преобразования примитивных массивов. В основном, есть ли какой-либо подход, чтобы избавиться от преобразования guava, потому что преобразование в 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));
}

Ответ 1

Нет специализированного FloatStream, поэтому то, что вы хотите, невозможно выполнить с помощью API Streams.

Если вы хотите получить преимущества float (половина памяти double) и по-прежнему использовать потоки, вам придется хранить ваши поплавки, закодированные в ints:

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 [].

Ответ 2

Вы можете использовать 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 будет в основном выполнять эту работу здесь.