Poniższe zadanie nie jest obowiązkowe. Polecamy je wykonać, jeśli zainteresował Cię temat i chcesz lepiej zrozumieć zaawansowane operatory i reaktywny styl tworzenia programów.
Zaawansowane metody sterowania strumieniami i przetwarzania danych
Wykonaj poniższe polecenia, aby zrealizować wymaganie funkcjonalne aplikacji:"Chcemy zapisywać na dysku tylko zdjęcia większe niż 100 kB (mniejsze nie nadają się do analizy). Jednocześnie w przypadku wszystkich pozostałych zdjęć wystarczy nam odpowiednio przeskalowana miniatura."
-
W
PhotoCrawlerstwórz metodęprocessPhotos(Observable<Photo>) : Observable<Photo>. Metoda posłuży do modyfikacji strumienia danych w taki sposób by wyjściowe dane do zapisu spełniały nasze wymagania-
Wykorzystaj odpowiednią metodę z
PhotoProcessordo odfiltrowania zbyt małych zdjęć. -
Otrzymany rezultat przekształć w taki sposób by pozostałe zdjęcia zostały zamienione na miniatury (
PhotoProcessor#convertToMiniature(Photo)).
Operacje do wykorzystania:
Filter(opens in a new tab),Map(opens in a new tab) -
-
Przygotowaną metodę wykorzystaj we wszystkich metodach zapisujących pobierane zdjęcia. Zastosuj zasadę: Don`t break the chain! (opens in a new tab)
Operacje do wykorzystania:
Compose(opens in a new tab)
Grupowanie danych w strumieniach
Do tej pory dzieliliśmy zdjęcia na małe i pozostałe. Teraz wprowadzimy dodatkowe rozróżnienie na zdjęcia małe, średnie i duże:
-
Małe zdjęcia powinny być pomijane (tak jak do tej pory).
-
Średnie zdjęcia będą zapisywane stosunkowo często, dlatego chielibyśmy je buforować przed zapisem. Bufor powinien opróżniany co 5s, a wszystkie zebrane w nim obrazy zapisane na dysk.
-
W przypadku dużych obrazów będziemy zapisywać miniatury. To czasochłonna operacja więc buforowanie w takim przypadku nie ma sensu. Możemy za to zoptymalzować ich przetwarzanie w taki sposób, by przychodzące duże obrazy lądowały w wątku z puli Schedulera calculation i dopiero tam były zamieniane na miniatury. Scheduler sam zadba o to by utrzymać optymalną dla procesora pulę wątków przeznaczonych na długotrwałe obliczenia. W celu zrealizowania tej części zadania zapoznaj się z operacją
ObserveOn(opens in a new tab) i porównaj ją z poznanym wcześniejSubscribeOn(opens in a new tab).💡Operacja
GroupBy(opens in a new tab) może się okazać przydatna. Warto także poszukać w dokumentacji dedykowanej funkcji, która pomoże nam zrealizować buforowanie elementów strumienia.