[uczę się na programistę JAVA - proszę o pomoc] Sumowanie BigDecimal w Streamach

0

Witam serdecznie.
Mam problem z jednym zadań z kursu - napisany przeze mnie kod zwraca mi wartość zero. Zadanie (Streszczone) wymaga:

  1. Utworzenia w pakiecie klas Country, Continent i World, oraz w pakiecie testowym WorldTestSuite.
  2. Klasa Country ma udostępniać metodę getPeopleQuantity() zwracającą liczbę typu BigDecimal.
  3. Klasa Continent powinna zawierać kolekcję krajów leżących na tym kontynencie.
  4. Klasa World powinna zawierać kolekcję kontynentów.
  5. W klasie World ma znaleźć się metoda getPeopleQuantity() zwracającą BigDecimal. Metoda oblicza sumę ludności używając flatMap() oraz reduce().
  6. Działanie metody testowane oczywiście w testSuite ;P

Cały napisany przeze mnie kod załączam w postaci snippetów.
Podejrzewam, że błąd popełniłem w poniższym fragmencie

public BigDecimal getPeopleQuantity(){
    return continentsOnWorld.stream()
            .flatMap(continent -> continent.getCountriesOnContinent().stream())
            .map(Country::getPeopleQuantity)
            .reduce(BigDecimal.ZERO, (sum, current) -> sum = sum.add(current));
}
2

Te hashcode 0 mocne xD No ale wracając do problemu: nie, to co pokazałeś wygląda ok. Problem pewnie w tym że nie masz zadnych krajów albo żadnych kontynentów, albo każdy kraj ma populacje 0. Popatrz że ten twój reduce sumuje ok:

        BigDecimal result = IntStream
                .range(0, 10)
                .mapToObj(BigDecimal::valueOf)
                .reduce(BigDecimal.ZERO, (sum, current) -> sum = sum.add(current));

więc problem leży w tym, że nie dostajesz nic do zsumowania.

0

więc problem leży w tym, że nie dostajesz nic do zsumowania.

Czyli metoda getPeopleQuantity z klasy Country mi zwraca 0... a nie powinna.
W teście tworzę kraje, które mają podaną liczbę mieszkańców typu bigDecimal...
Chyba że jednak test źle skleciłem

1

OT
Co to za kurs z "Europian countries" i "people quantity"?

*Population of European countries *

2

W konstruktorze Continent jako drugi parametr masz listę krajów, ale nie używasz jej w żaden sposób co owocuje pustymi kontynentami.
Zmień też to (sum, current) -> sum = sum.add(current) na (sum, current) -> sum.add(current) (i docelowo na method reference jak ogarniasz). W tej chwili wydaje Ci się że w tej lambdzie modyfikujesz sumę ale to nieprawda - suma powinna być zwracana z lambdy co prowadzi do używania "czystej" funkcji redukującej (zostawienie = w tym momencie też zadziała jako że zwracana jest wartość wyrażenia przypisania, ale nie ma to sensu i jedynie zaciemnia kod).

1

Dzięki - faktycznie jak dodałem w konstruktorze Set zaskoczyło.

1 użytkowników online, w tym zalogowanych: 0, gości: 1