Stream-flatmap i reduce

0

Cześć, czy ktoś pomoże mi zrozumieć jak działa stream i flatmap? Potrzebuję napisać test z wykorzystaniem streama oraz flatmap. Ma on za zadanie przetestować metodę "getPeopleQuantity" z klasy "World". Zwracana liczba ma być typu BigDecimal. Tak w skrócie to mam 3 klasy (Country, Continent i World) Country udostępnie metodę getPeopleQuantity, klasa Continent zawiera kolekcję państw leżących na danym kontynencie, a klasa World zawiera kolekcję kontynentów. Napisałem taki test, ale nie bardzo wiem/rozumiem jak napisać sekcję When z wykorzystaniem streama, flatmap i reduce tak aby przetestował tą metodę i policzył wielkość populacji :/

@Test
    public void testGetPeopleQuantity() {
        //Given
        World world = new World();
        List<Continent> continents = new ArrayList<>();
        List<Country> countries = new ArrayList<>();
        countries.add(new Country("Poland", new BigDecimal(350000000)));
        countries.add(new Country("Spain", new BigDecimal(450000000)));
        continents.add(new Continent(countries, "Europe"));
        world.setContinentList(continents);
        //When
        BigDecimal worldPeopleQuantity = countries.stream()
                .flatMap(country -> country.getPeopleQuantity())
                .reduce(BigDecimal.ZERO, (sum, current) -> sum = sum.add(current));
        //Then
        BigDecimal expectedQuantity = new BigDecimal("800000000");
        Assert.assertEquals(expectedQuantity, worldPeopleQuantity);
    }
0

Tak na oko, nie wiem czy to jedyny błąd: w reduce() powinieneś zwrócić nowa instancje BigDecimala (wynik dodawania) zamiast przypisywać na parametr.

0
Charles_Ray napisał(a):

Tak na oko, nie wiem czy to jedyny błąd: w reduce() powinieneś zwrócić nowa instancje BigDecimala (wynik dodawania) zamiast przypisywać na parametr.

Wywala się wcześniej na linijce z flatMap:

screenshot-20191031225351.png

4

Zauważ, że zaczynasz od krajów (lista krajów), a przecież (zgodnie z zadaniem) masz mieć listę kontynentów (z world).

Jak sobie weźmiesz listę kontynentów to tam są kraje - fajnie tylko, że to jest lista list. (lista kontynentów to lista list krajów).
(Jak zrobisz map na liscie kontynentów to dojdziesz do takiej listy).
Gdyby tylko była operacja, która pozwala spłaszczyć taką listę list do prostej listy (krajów).
Spłaszczyć,
flatten,
ciekawe jak może się nazywać takie map, które spłaszcza...

Jak zaczniesz dobrze od

BigDecimal worldPeopleQuantity = world.getContinentList().stream()

to Ci powinno wyjść samo.

0

screenshot-20191101211137.png

Co takiego napisałem i śmiga, dzięki za pomoc ;)

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