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
, ascala.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 aString
is ajava.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 aNil
nevű objektum. Hogy hogyan lehetséges az, hogy ez az objektum egyszerre jóList[Int]
-nek is megList[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 |
|
- 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 |
|
-
A
List[T]
-ben egyebek mellett szerepelnek afilter(p: T => Boolean): List[T]
és amap[U](f: T => U): List[U]
metódusok, pontosan ugyanazzal a viselkedéssel, ahogy korábban a sajátunkat implementáltuk. Vanreduce(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.