2014-12-16 17 views
10

Próbuję przekonwertować double[] na float[] przy użyciu rachunku lambda Java 8. Do tej pory właśnie stworzyłem metodę zabawek, która powinna zostać zmieniona. Próba znalezienia pomocy na konwersję prymitywnych tablic. Najczęściej jest jakikolwiek sposób na pozbycie się konwersji guava, ponieważ konwersja na listę i powrót jest zbyt duża dla dużych tablic.Lambda na prymitywnych tablicach

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

Co ciekawe, nie ma wyspecjalizowanego strumienia dla 'Float' - istnieją tylko predefiniowane' IntStream', 'DoubleStream' i' LongStream'. W przypadku 'float' może się zdarzyć, że będziesz musiał wykonać całą tę dziwną pracę. – Makoto

+1

Dlaczego trzeba to zrobić za pomocą rachunku lambda? –

+0

@pbabcdefp do eksperymentowania. Próba znalezienia sposobu na pozbycie się pętli –

Odpowiedz

7

Nie ma wyspecjalizowaną FloatStream, więc co chcesz nie jest wykonalne z API strumieni.

Jeśli chcesz czerpać korzyści z float (pół pamięci double) i nadal korzystać ze strumieni, trzeba będzie przechowywać pływaki zakodowane w int:

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))); 

Trzeba by mieć w przeważającej dobry powód do torturowania się w ten sposób. Jeśli nie masz zamiaru przechowywać setek milionów liczb w tej tablicy, prawdopodobnie lepiej jest użyć podwójnego [].

4

Możesz nadal używać IntStream jako looper dla swojej podwójnej macierzy.

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; 
} 

Tak to nie jest jedno-liner i jakoś podobna do tradycyjnej pętli, ale API Stream nie zawsze jest substytutem. Pętla for w dużej mierze wykonałaby tę pracę.

+2

Ma tę zaletę, że pozwala na równoległe wypełnianie tablicy float, ponieważ kolejność jest równa nieważne. –

Powiązane problemy