2017-12-28 199 views
21

Chcę znaleźć sumę List<int[]> przy użyciu Java 8. Oto moja próba.Jak podsumować wartości na liście <int[]> przy użyciu Java 8

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

jednak otrzymuję błąd nie można konwertować do Stream<Object> do <unknown>.

+3

Proszę zwrócić uwagę na obszar podglądu podczas wprowadzania/edycji posta. Osadzone wsporniki kątowe MUSZĄ być sformatowane jako kod (za pomocą przycisków cofania) lub znikają. –

+1

Co zamierzasz robić ".mapToInt (m)"? Czym jest 'm'? – AJNeufeld

+2

Co powiesz na podwójną pętlę? – John

Odpowiedz

30

chcesz flatMap do IntStream. Po tym, pobieranie sumy jest łatwe.

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

Twoja i jest prymitywną tablicą (int[]), więc zwróci wartość Stream<int[]>.

Proponuję najpierw obliczyć sumę poszczególnych tablicy, a następnie zsumować wszystkie z nich:

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

Nie ma potrzeby wykonywania dwóch wywołań map: 'counts.stream(). MapToInt (ar -> IntStream.of (ar) .sum()). Sum()' – Andreas

+0

Dziękuję, naprawdę doceniam czas na wyjaśnienie "W jaki sposób? ' – BreenDeen

+0

@Andreas Masz całkowitą rację. Dzięki – Eran

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

lub 'flatMapToInt (Arrays :: stream)' przy użyciu odwołania do metody i 'Arrays.stream()', ponieważ to właśnie wywołuje 'IntStream.of()' wewnętrznie. – Andreas

+6

Tak lub IntStream :: of. Uważam, że lambda jest nieco jaśniejsza dla początkujących. –

+1

Czy przyjęcie sumy int [] byłoby bardziej efektywne (co tutaj robisz)? Wygląda na to, że twój kod jest trochę bardziej gadatliwy, ale ma mniej autoboxing do Integer. – markspace

5

Można zrobić to w ten sposób:

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

Ten pracował dla mnie:

int sum = counts.stream().mapToInt(i -> Arrays.stream(i).sum()).sum();