2014-12-16 18 views
10

Java 8 lambda hesabı kullanarak double[]'u float[]'a dönüştürmeye çalışıyorum. Şimdiye kadar, revize edilmesi gereken bir oyuncak metodu oluşturdum. İlkel dizileri dönüştürmek için yardım bulmaya çalışıyorum. Çoğunlukla, guava dönüşümden kurtulmak için bir yaklaşım var, çünkü Listeye dönüyor ve büyük diziler için çok ağır. Hiçbir uzman FloatStream yokturİlkel diziler üzerinde Lambda

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

İlginçtir ki, Float için özel bir akış yok - sadece "IntStream", "DoubleStream" ve "LongStream" önceden tanımlanmış. 'Float' için, tüm bu işe yaramış işi yapmak zorunda olmanız belki de olabilir. – Makoto

+1

Neden lambda hesabı kullanılarak yapılmalıdır? Deneme için –

+0

@ pbabcdefp. Döngüden kurtulmanın düzgün bir yolunu bulmaya çalışın –

cevap

7

, böylece istediğini Akışları API ile yapılabilir değildir.

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

Sen ezici bir olması gerekir: Hala akışları kullanın float yararları (double yarısı bellek) ve almak istiyorsanız

, kendi yüzer ints kodlanmış saklamak zorunda kalacak Kendine böyle işkence etmek için iyi bir sebep. Bu dizide yüz milyon numara saklamayı düşünmüyorsanız, sadece çift [] kullanmanız daha iyi olacaktır.

4

Çift diziniz için IntStream bir lüper olarak kullanabilirsiniz.

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

Evet bu tek liner ve geleneksel döngü için bir şekilde benzer değil, ama Akış API her zaman yerine geçmez. Bir döngü için büyük ölçüde burada iş yapardı.

+2

Sipariş olduğundan, float [] dizisinin paralel olarak doldurulmasına izin verme avantajı vardır. önemli değil. –