2017-03-28 14 views
5

Tôi mới sử dụng luồng trong java, vì vậy đây là câu hỏi của tôi. Tôi có một [] [] gấp đôi, trong đó tôi muốn thực hiện tổng kết các phần tử, vì nó tôi đã theo dõi và aproach tương tự như C# Linq, nhưng có vẻ như không hoạt động.Luồng dòng 2D giảm trong java

Arrays.stream(myArray).reduce(0,(acc, i) -> acc + Arrays.stream(i).sum()); 

Lỗi là acc có vẻ là gấp đôi [], vì vậy nó không thể thực hiện gấp đôi [] + gấp đôi. Trong C# LINQ bộ tích lũy được giả định là cùng loại với hạt giống (0 trong trường hợp này). Những gì tôi đang mất tích? Cảm ơn trước.

Trả lời

5

Nếu bạn nhìn vào chữ ký của reduce, loại danh tính phải là loại phần tử của luồng. Mà sẽ là double[] trong trường hợp này. Điều đó cũng sẽ cung cấp cho acc loại double[].

Có tình trạng quá tải nơi bạn có thể cung cấp bộ tích lũy loại khác, nhưng bạn cũng cần phải vượt qua bộ kết hợp, để kết hợp 2 bộ tích lũy.

Bạn có thể làm điều này:

double result = Arrays.stream(myArray) 
    .reduce(0D, (acc, i) -> acc + Arrays.stream(i).sum(), Double::sum); 

đâu 0D là một double theo nghĩa đen, và Double::sum được sử dụng để kết hợp 2 ắc quy.

Ngoài ra, nó có thể là thuận tiện hơn để làm điều này:

double result = Arrays.stream(myArray) 
    .flatMapToDouble(DoubleStream::of) 
    .sum(); 
+0

Rất nhiều cảm ơn, tôi đã hiểu được nó bây giờ. – BoRDeX

+1

flatMap là cách tiếp cận sạch sẽ nhất. –

+0

Tôi thích 'Arrays.stream (myArray) .flatMapToDouble (Mảng :: stream) .sum();' vì đây không phải là trường hợp sử dụng varargs. Và 'Arrays :: stream' thậm chí còn ngắn hơn' DoubleStream :: of'… – Holger

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