2014-12-16 28 views
10

Sto provando a convertire un double[] in float[] utilizzando il calcolo lambda Java 8. Finora, ho appena creato un metodo giocattolo che dovrebbe essere rivisto. Cercando di trovare aiuto per convertire gli array primitivi. Per lo più, esiste un approccio per sbarazzarsi della conversione di guava perché la conversione in List e back è troppo pesante per i grandi array.Lambda su matrici primitive

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

È interessante notare che non esiste un flusso specializzato per 'Float' - esistono solo' IntStream', 'DoubleStream' e' LongStream' predefiniti. Per 'float', potrebbe essere il caso che devi fare tutto questo lavoro laborioso. – Makoto

+1

Perché è necessario farlo utilizzando il calcolo lambda? –

+0

@pbabcdefp per sperimentare. Cercando di trovare un modo pulito per sbarazzarsi del ciclo –

risposta

7

Non c'è specializzata FloatStream, quindi ciò che si vuole non è fattibile con l'API Streams.

Se si desidera ottenere i benefici di float (metà della memoria di double) e continuare a utilizzare corsi d'acqua, si dovrà memorizzare i carri codificato in interi:

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

che avrebbe dovuto avere una schiacciante buon motivo per torturarti in questo modo. A meno che non stiate progettando di memorizzare un centinaio di milioni di numeri in questo array, è probabile che stiate usando semplicemente il doppio [].

4

È ancora possibile utilizzare uno IntStream come looper per il doppio array.

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

Sì questa non è una battuta, e in qualche modo simile ad un anello tradizionale, ma l'API Stream non è sempre un sostituto. Un ciclo for farebbe in gran parte il lavoro qui.

+2

Ha il vantaggio di consentire all'array float [] di essere riempito in parallelo, poiché l'ordine è non importante. –