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.HashMap
amutable.HashSet
se dočkaly nové rychlejší implementace. KešujíhashCode
a spojový seznam kolidujících klíčů je podle něj seřazen. To má za následek zrychlení v případech, kdy výpočethashCode
není ú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.Vector
jsou 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.HashMap
chová 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á
PartialFunction
zá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ý.