Další novinky ve Scale 2.13
Vyšel první kandidát pro vydání nové verze Scaly 2.13, který od poslední milestone verze přinesl několik užitečných novinek. Tohle jsou některé z nich:
- První se nebude líbit funkcionálním puristům, kteří by nesáhli na cokoli
měnitelného ani desetimetrovou tyčí.
mutable.HashMapamutable.HashSetse dočkaly nové rychlejší implementace. KešujíhashCodea spojový seznam kolidujících klíčů je podle něj seřazen. To má za následek zrychlení v případech, kdy výpočethashCodenení úplně triviální a mapa obsahuje značné množství kolizí.1 A taky konečně berou v potaz volánísizeHint. - Malé instance
immutable.Vectorjsou menší, pokud obsahují méně než 32 prvků. To je dobrá zpráva, protože prázdnýVector– výchozí implementaceimmutable.IndexedSeq– odteď už nebude zabírat ~350 bajtů. - Na kolekcích přibyla metoda
tapEach, která funguje podobně jako unixový příkaztee. Přesně tohle by se mi už několikrát hodilo. - Interpolované stringy je možno použít jako extraktor pro pattern matching:
val s"$greeting, $name" = "Hello, James"
To samo o sobě není nijak převratné, ale hodí se pro kompletnost. Navíc se tak můžeme někdy pohodlně vyhnout regexům, které v Javě nejsou nijak zvlášť rychlé.
- Přibyla
CollisionProofHashMap– měnitelná hashmapa, která velké množství kolizí reprezentuje jako red-black strom namísto spojového seznamu a proto má v nejhorším případě logaritmickou složitost namísto lineární. V Javě se takjava.util.HashMapchová ve výchozím stavu, není třeba používat specializovanou kolekci. Rozdíl je v tom, že scalovské třída s tímto chováním počítá a funguje jen pro typy, pro které existuje řazení a proto je o něco rychlejší. - Jako poslední musím vyzdvihnout novinky pro parciální funkce a extraktory. Od verze 2.13 bude každá
PartialFunctionzároveň extraktorem použitelným pro pattern matching a také bude možné jednoduše převést funkci typuX => Option[Y]naPartialFunction[X, Y]metodouunlift(opak metodylift). Nejde o nic převratného, ale aspoň se tři koncepty jazyka, které k sobě mají velice blízko, ale nebyly zcela slučitelné, se sobě navzájem víc přiblíží.
val map = Map("xxx" => 1) "xxx" match { case map(i) => i // <- teď můžu udělat tohle case _ => 0 // protože Map implementuje PartialFunction }
- Jako v případě Robin Hood hašování je v případě, že hledám klíč, který není přítomný v mapě, skončit s hledáním jakmile narazím na hash větší než hledaný.