2014-12-16 24 views
10

Tôi đang cố gắng chuyển đổi một double[] thành float[] bằng cách sử dụng tính toán Java 8 lambda. Cho đến nay, tôi vừa tạo ra một phương pháp đồ chơi cần được sửa đổi. Đang cố gắng tìm trợ giúp để chuyển đổi các mảng nguyên thủy. Chủ yếu là, có cách tiếp cận nào để loại bỏ chuyển đổi ổi vì chuyển đổi sang Danh sách và ngược lại quá nặng đối với các mảng lớn.Lambda trên mảng nguyên thủy

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

Điều thú vị là không có luồng chuyên biệt cho 'Float' - chỉ có' ​​IntStream', 'DoubleStream' và' LongStream' được xác định trước. Đối với 'float', nó chỉ có thể là trường hợp mà bạn phải làm tất cả công việc khó sử dụng này. – Makoto

+1

Tại sao nó cần phải được thực hiện bằng cách sử dụng tính toán lambda? –

+0

@pbabcdefp để thử nghiệm. Cố gắng tìm một cách gọn gàng để thoát khỏi vòng lặp –

Trả lời

7

Không có chuyên ngành FloatStream, vì vậy điều bạn muốn không thể thực hiện được với API luồng.

Nếu bạn muốn nhận được những lợi ích của float (nửa bộ nhớ của double) và vẫn sử dụng con suối, bạn sẽ phải lưu trữ nổi của bạn được mã hóa trong 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))); 

Bạn sẽ cần phải có một áp đảo lý do tốt để tra tấn chính mình như thế này. Trừ khi bạn đang có kế hoạch để lưu trữ một trăm triệu con số trong mảng này, bạn có thể tốt hơn off chỉ bằng cách sử dụng đôi [].

4

Bạn vẫn có thể sử dụng IntStream làm công cụ cho mảng kép của mình.

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

Có điều này không phải là một lớp lót và bằng cách nào đó tương tự như vòng lặp truyền thống, nhưng API luồng không phải lúc nào cũng thay thế. Một vòng lặp cho phần lớn sẽ làm công việc ở đây.

+2

Nó có lợi thế là cho phép mảng float [] được điền song song, vì thứ tự là không quan trọng. –

Các vấn đề liên quan