2017-12-28 167 views
21

Tôi muốn tìm tổng của List<int[]> bằng Java 8. Đây là nỗ lực của tôi.Cách tính tổng các giá trị trong Danh sách <int[]> bằng cách sử dụng Java 8

int sum = counts.stream().flatMap(i -> Stream.of(i).mapToInt(m)).sum(); 

Tuy nhiên, tôi gặp lỗi không thể chuyển đổi thành Stream<Object> thành <unknown>.

+3

Hãy chú ý đến khu vực xem trước khi vào/chỉnh sửa bài. Các dấu ngoặc nhọn được nhúng PHẢI được định dạng dưới dạng mã (sử dụng các dấu gạch chéo ngược) hoặc chúng biến mất. –

+1

Bạn dự định '.mapToInt (m)' đang làm gì? 'M' là gì? – AJNeufeld

+2

Làm thế nào về một đôi cho vòng lặp? – John

Trả lời

30

Bạn muốn flatMap vào IntStream. Sau đó, lấy số tiền rất dễ dàng.

int sum = counts.stream() 
     .flatMapToInt(IntStream::of) 
     .sum(); 
7

i của bạn là một mảng nguyên thủy (int[]), vì vậy Stream.of(i) sẽ trả lại Stream<int[]>.

Tôi đề nghị đầu tiên bạn tính toán số tiền của mỗi mảng cá nhân và sau đó tổng hợp tất cả trong số họ:

int sum=counts.stream() 
       .mapToInt(ar->IntStream.of(ar).sum()) // convert each int[] to the sum 
                // of that array and transform the 
                // Stream to an IntStream 
       .sum(); // calculate the total sum 
+4

Không cần hai cuộc gọi bản đồ: 'counts.stream(). MapToInt (ar -> IntStream.of (ar) .sum()). Sum()' – Andreas

+0

Cảm ơn bạn, tôi thực sự đánh giá cao thời gian để giải thích 'Cách thức ' – BreenDeen

+0

@Andreas Bạn hoàn toàn chính xác. Cảm ơn – Eran

14
int sum = counts.stream().flatMapToInt(array -> IntStream.of(array)).sum(); 
+2

hoặc 'flatMapToInt (mảng :: stream)' bằng cách sử dụng tham chiếu phương thức và 'Arrays.stream()', vì đó là những gì 'IntStream.of()' gọi nội bộ. – Andreas

+6

Yep hoặc IntStream :: của. Tôi tìm thấy lambda hơi rõ ràng hơn cho người mới, mặc dù. –

+1

Sẽ lấy tổng của một int [] trực tiếp có hiệu quả hơn (như bạn đang làm ở đây)? Có vẻ như mã của bạn hơi dài hơn một chút nhưng có ít hộp số tự động hơn đến Số nguyên. – markspace

5

Bạn có thể làm theo cách này:

int sum = counts.stream()        // getting Stream<int[]> 
       .mapToInt(a -> Arrays.stream(a).sum()) // getting an IntStream with the sum of every int[] 
       .sum();         // getting the total sum of all values. 
2

này đã làm việc cho tôi:

int sum = counts.stream().mapToInt(i -> Arrays.stream(i).sum()).sum(); 
Các vấn đề liên quan