Příklad Evidence hovorů - řešení
Ačkoli se tato úloha může zdát na první pohled komplikovaná, její řešení je snadné. Dle zadání má být úloha řešena pomocí datových proudů. Nejprve je tedy na místě vytvořit ze seznamu hovorů datový proud. Tak získáme datový proud prvků typu Hovor
. Ovšem úkolem není zjistit počet hovorů, ale počet telefonních čísel, ze kterých byly tyto hovory uskutečněny. Nyní proto nelze zavolat metodu count()
.
Duplicitní prvky v datovém proudu je nejprve nutné nějak eliminovat. K tomu může pomoci metoda distinct()
, která vrací datový proud obsahující pouze ty prvky, které jsou dle metody equals()
unikátní. Ovšem nelze jí zavolat přímo na prvky typu Hovor
, protože každý hovor v seznamu má unikátní kombinaci hodnot svých atributů. Je tedy potřeba prvky nějak upravit.
Úprava spočívá v převedení jednotlivých prvků z typu Hovor
na typ String, kde budou pouze telefonní čísla (tak získáme prvky, které mezi sebou lze porovnávat). K tomu je vhodné použít metodu map()
, jejíž parametrem bude instance funkčního rozhraní Function<T,R>
získaná pomocí lambda výrazu. Daný lambda výraz bude implementovat abstraktní metodu tohoto rozhraní tak, aby vracela telefonní číslo daného hovoru jako String
.
Nyní se v datovém proudu vyskytují prvky typu String, mezi kterými jsou stále duplicity (viz poznámka v zadání). Stále tedy není možné zavolat metodu count()
, protože tím bychom zjistili pouze celkový počet prvků v datovém proudu. Nyní už je možné použít metodu distinct()
. Dalším krokem tedy bude duplicity odstranit. A následně na nově vzniklý datový proud lze zavolat metodu count()
, která vrátí počet prvků v již upraveném datovém proudu. Výsledný kód lze vidět níže.
EvidenceHovoru evidence = new EvidenceHovoru();
List<Hovor> seznam = evidence.getSeznamHovoru();
long pocetVolajicich = seznam.stream()
.map((c) -> c.getCislo())
.distinct()
.count();
Celkové řešení je v projektu Evidence hovorů - řešení.