Kihagyás

18 - scala.collection.immutable.List

Természetesen a lista mint adatszerkezet annyira alap komponense a funkcionális programozás eszköztárának, hogy van belőle built-in, nem kell újra írnunk mindig egyet. Nagyon sokrétű, a funkcionalitásai egy részével össze fogunk ismerkedni a félév során, mindenesetre:

  • A típus neve List, a scala.collection.immutable csomagban van benne.
  • Nem kell kiírjuk a teljes nevét, sem importolnunk a csomagot, mert szerepel a Predef objektumban rá a type alias, ezért ha csak annyit írunk, List, róla beszélünk. (Ahogy a String is a java.lang.String.)
  • Generic típus, a lista elemeinek típusát kapja paraméterként.
  • Az eddigi Ures objektumunknak (amit genericként egyelőre csak mint case classt tudtunk összehozni) megfelelő üres lista a Nil nevű objektum. Hogy hogyan lehetséges az, hogy ez az objektum egyszerre jó List[Int]-nek is meg List[String]-nek is (ezt nem tudtuk eddig megoldani a saját generikus listánkkal), arra a kovariáns generikus paramétereknél még visszatérünk.
  • Az eddigi Nemures lista case classunknak megfelelő nemüres lista osztály neve ::. Így, két kettőspont, ez az osztály neve, igen. Tehát például az (1,4,2) listát létrehozhatjuk így:

    1
    val list: List[Int] = ::(1, ::(4, ::(2, Nil) ) )
    

  • A :: osztály nevét infix is használhatjuk konstruáláskor, így is szokás:

1
val list = 1 :: 4 :: 2 :: Nil //note: erről is ki tudja következtetni a fordító, hogy List[Int] -- látni fogjuk később, hogyan
  • Sőt így is létrehozhatjuk ugyanezt (köszönhetően a companion object apply metódusának, ezt is látni fogjuk később):
1
val list = List(1,4,2)
  • A List[T]-ben egyebek mellett szerepelnek a filter(p: T => Boolean): List[T] és a map[U](f: T => U): List[U] metódusok, pontosan ugyanazzal a viselkedéssel, ahogy korábban a sajátunkat implementáltuk. Van reduce(op: (T,T)=>T):T és pl. foldLeft[U](init: U)(op: (U,T)=>U): U metódusa is.

  • Lehet rá mintailleszteni match kifejezésben, a nemüres listának van egy feje és egy farka, head :: tail-ként illeszthető rá a minta, de persze fordul a ::(head, tail) lista is, de kevésbé bevett szokás.

Kérdések, feladatok


Utolsó frissítés: 2021-02-07 23:06:47