Scala Collections Workshop

V Etneteře se konal v pořadí druhý workshop zaměřený tentokrát na základní principy a techniky Scala Collections API, do kterých nás zasvěcoval agilní kouč a školitel Scaly Karel Smutný. Společně jsme kódovali příklady manipulující se seznamem modelů automobilů a poctivě testovali v duchu Test Driven Development. Co zajímavého nám Scala kolekce nabízí a proč byste je mohli chtít použít i ve vašich projektech, si představíme v tomto článku.

Základní vlastnosti Scala kolekcí

Collections API ve Scale poskytuje immutable i mutable kolekce, je funkčně bohaté, připravené pro paralelní zpracování, umožňuje řetězení operací, které jsou společně vykonány na prvcích kolekce, až když je potřeba (lazy způsobem) a přirozeně používá funkce (např. predikáty pro filtrování prvků).

Snahou o funcionální používání kolekcí je známá i knihovna Google Guava určená pro Javu, Guava ovšem naráží na limity Javy jako jazyka a oproti Scale stále zahrnuje mnoho boilerplate kódu (typicky jsme nuceni použít nepříliš elegantní zápis anonymní implementace rozhraní funkce, zatímco ve Scale použijeme stručný zápis funkčního literálu).

Velkou výhodou Scala Collections API je propracovaná hierarchie kolekcí, snadný přechod mezi mutable a immutable kolekcemi, Scala a Java kolekcemi, přechod ke kolekcím podporujícím paralelizované operace, unifikované používání kolekcí, kdy např. i pole je používáno stejným způsobem jako ostatní kolekce (a podporuje řadu operací, které jsou dostupné v ostatních kolekcích), i když interně je pole implementováno nad efektivními poli v Javě.

Také s řetězci lze snadno pracovat jako s kolekcemi, neboť jsou implicitně konvertovatelné na indexované sekvence (IndexedSeq), jeden z často používaných typů kolekcí ve Scale. Všechny kolekce jsou přirozeně generické, Scala není zatížená různými diskrepancemi, které můžeme pozorovat v javovských knihovnách, které na generické kolekce postupně přecházely.

Speciální kolekce

Knihovna kolekcí ve Scale obsahuje také některé méně "tradiční" typy kolekcí:

  • Range - rozsah daný počáteční, koncovou hodnotou a velikostí kroku.
  • Stream - seznam s lazy dopočítávanými prvky, které následují za prvním prvkem kolekce (head a lazy implementovaný tail). Pokud chcete postupně iterovat např. prvky Fibonnaciho řady, všemi prvočísly, nebo provádět operace nad všemi přirozenými čísly, aniž by ve skutečnosti byly hned vyhodnocovány, bude Stream váš kamarád.

Dotazování nad kolekcemi

Kolekce implementují operace map, flatMap (transformace prvků), filter, withFilter (odfiltování některých prvků na základě predikátu) a foreach (vykonání operace pro každý prvek). Tyto operace přijímají funkce jako své vstupní parametry. Pouze díky tomu, že kolekce implementují tyto operace, je možné je používat jako generátory prvků ve for expression (obdoba příkazu for z Javy, na kterou lze spíše pohlížet jako na konstrukci pro dotazování - procházení, transformaci, filtrování a vracení výsledků - než na příkaz pro pouhou iteraci). Také vaše objekty (kontejnery) mohou takové dotazování podporovat, pokud budou zmíněné operace implementovat.

Několik příkladů na závěr

Jako ochutnávku Scala kolekcí si uveďme pár příkladů:

Vytvoření kolekce, která provádí operace nad svými prvky ve více vláknech:

Použití view - vytvoření SeqView, které si pamatuje operace vykonávané na kolekci (v příkladu se jedná o operace filter a map) a provede je, až když je skutečně potřeba, aniž by byly zbytečně vytvářeny další kolekce jako mezivýsledky (v příkladu se operace provedou až při volání metody sum, kdy je potřeba view materializovat ve výslednou kolekci a posčítat její prvky; explicitně lze materializaci provést také voláním metody force):

Předchozí příklad s použitím for expression (jistě přehlednější varianta):

Kam dále?

Účastníci workshopu ocenili jednoduché API pro transformaci, filtrování i řazení kolekcí, pomocí kterého je možné zpracovávat seznamy dat prakticky na pár řádcích a také out-of-box implementace immutable a paralelních kolekcí, které Scala Collections API nabízí. Immutable kolekce lze snadno používat v paralelních algoritmech. Pokud vás také Scala kolekce zaujaly, nemůžete minout Úvod do Scala kolekcí od Martina Oderskyho a Lexe Spoona. V kapitole Mutable and Immutable Collections naleznete přehledné zobrazení hierarchie immutable a mutable kolekcí ve Scale.

Článek obsahuje 0 komentářů