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