====== Domácí úkol 4 ======
//Tento domácí úkol se dotkne témat: funkcionální programování, lambda funkce, map reduce, funkce vyššího řádu a promise v Javě.//
===== Úvod =====
V tomto úkolu se zaměříme na české prezidentské volby. Konkrétně nás budou zajímat její výsledky a zajímavé statistiky z nich plynoucí. Vaším úkolem bude tedy vzít otevřená data Českého statistického úřadu a z těchto dat vytěžit zajímavé statistiky.
Zdroje datových sad:
- Prezidentské volby 2023 [[https://www.volby.cz/opendata/prez2023nss/prez2023nss_opendata.htm]]
- Prezidentské volby 2018 [[https://www.volby.cz/opendata/prez2018/prez2018_opendata.htm]]
- Prezidentské volby 2013 [[https://www.volby.cz/opendata/prez2013/prez2013_opendata.htm]]
===== Zadání =====
{{ courses:b6b36omo:hw:042023:homework_functions_task.zip | Šablona 4. domácího úkolu}}
Stáhněte si šablonu pro 4. domácí úkol. Najdete zde 4 datové sady (1. kolo 2018, 2. kolo 2018, 1. kolo 2023 a 2. kolo 2023) výsledků českých prezidentských voleb. Dále zde najdete již hotové načítání datové sady, její parsování a mapování do připraveného objektového modelu a šablony tříd pro výpočet statistik. Vaším úkolem je doplnit všechny metody, které obsahují pouze komentář ''%%TODO Homework%%'' místo reálné implementace.
Abyste si mohli správnost Vašeho řešení průběžně kontrolovat, najdete zde několik unit testů. Ty jsou dělané vůči 2. kolu voleb z roku 2023. Dále můžete využit třídu ''%%Main%%'', ve které najdete několik výpisů statistik. Ty pak můžete porovnat vůči surovým datům nebo se jen tak kochat Vašimi statistikami.
Neupravujte jiné třídy než ty, ve kterých je právě komentář ''%%TODO Homework%%''.
Aby to nebylo zas tak jednoduché a doopravdy jste si vyzkoušeli funkcionální prvky v Javě, je v celém úkolu zakázané používat cykly a podmíněné bloky. Naopak žádoucí a povinné je použití StreamAPI, lambda funkcí, referencí metod, Optional a funkcí vyššího řádu. Dále omezte deklarace proměnných a zaměřujte se hlavně na funkce. Pomocné private metody zakázané nejsou.
**Zakázané** je použití cyklů (**for, for-each, while, do-while**) a podmíněných bloků (**if, if-else, switch**) v celém úkolu.
Doporučuji použít StreamAPI, Optional, lambda funkce, reference na metody a funkce vyššího řádu. Deklaraci proměnných omezte a použijte místo toho pomocnou private metodu.
==== Datová sada ====
Každá datová sada se skládá z 16 xml souborů. Prvních 14 se jmenují vždy ''%%CZ0xx.xml%%'' (kód [[https://www.volby.cz/opendata/prez2023nss/PREZ_nuts.htm|NUTS]]). Tyto soubory obsahují výsledky voleb z jednotlivých krajů ČR a jejich obcí. Dále zde najdete soubor ''%%kandidati.xml%%'', který obsahuje data o kandidátech na post prezidenta české republiky. Posledním souborem je ''%%zahranici.xml%%'', který obsahuje výsledky hlasování na zastupitelských úřadech v zahraničí.
Datovou sadu nemusíte nijak parsovat. Toto je již implementované v šabloně úkolu za pomocí knihovny JAXB. Pokud by Vás to zajímalo, najdete to ve třídě ''%%OfflineDataLoader%%''. Třídy datového modelu pro Váš úkol najdete v package ''%%cz.cvut.fel.omo.hw.functions.data.model%%''. Ovšem jeden háček v parsování tu přecejen je. Data nedostanete přímo, ale zabalená jako ''%%CompletableFuture%%'' (implementace Promise patternu v Javě). //To nám dovoluje například v budoucnu implementovat OnlineDataLoader, který bude asynchroně stahovat datové sady.//
Nezapomínejte, že do celkových statistik musíte započítat nejenom výsledky krajů, ale i hlasování na zastupitelských úřadech v zahraničí!
V některých městech v některých datových sadách došlo k remíze mezi kandidáty. Remíza v takovém městě se považuje jako vítězství pro všechny remizující kandidáty.
===== Odevzdání =====
Vaše řešení odevzdávejte přes odevzdávací systém [[https://cw.felk.cvut.cz/brute/|BRUTE]]. Odevzdejte pouze třídy ''%%AbroadStatisticsImpl%%'', ''%%CandidateStatisticsImpl%%'', ''%%ElectionStatisticsImpl%%'', ''%%NationalStatisticsImpl%%'', ''%%CandidateUtilsImpl%%''. Dále můžete přibalit třídy ''%%CompletableFutureUtils%%'' a ''%%ElectionsUtilsImpl%%'', pokud jste je doimplementovali a využili. Všechny třídy, které odevzdáváte nahrajte v ZIP archivu.
Všechny nahrávané třídy musí být v původním package. Nepřesouvejte tedy nijak třídy, nepřejmenovávejte a neměňte jejich konstruktor.
Pokud nepovinné třídy nevyužijete, ale necáte je v importech, Váš kód nepůjde zkompilovat!
Vaše řešení nebude testováno jen proti veřejně dostupným datům, ale i proti datům smyšlených voleb!