20 - map, for és yield

Láttunk már korábban a foreach-hez hasonló metódust, ez pedig a map volt. Mindkettő egy f: T=>U függvényt vár, ha (mondjuk) egy List[T]-n hívjuk, és

  • mindkettő kiértékeli f-et a lista összes elemén,
  • a foreach eldobja az eredményeket és visszakapjuk értékként a () Unitot
  • a map az eredményekből készít egy új listát és azt adja vissza

for yield

Ha a mapre van szükségünk, azt is for comprehensionnel végeztethetjük el, a comprehension és a magjában lévő kifejezés közé illesztve a yield kulcsszót:

1
2
3
val list = List(1, 4, 2, 8, 5, 7)
val negyzetek = for( elem <- list ) yield elem * elem
println( negyzetek ) //prints List(1, 16, 4, 64, 25, 49)

Vegyük észre az egyik fontos különbséget egy imperatív nyelv ,,for ciklusa'' (ami egy utasítás, mely nem tér vissza semmilyen értékkel, nem szerepelhet pl. értékadás jobb oldalán ilyesmi Javában vagy C-ben) és a for yield kifejezés közt: ennek a kifejezésnek ebben a példában van értéke, mégpedig az a kollekció, melyet úgy kapunk, hogy a lista minden elemén alkalmazzuk f-et, az eredményeket pedig egy listába szervezzük.

Kérdések, feladatok

  • Ha c típusa List[T], és ha x típusa T, akkor E típusa U, akkor mi lesz a for( x <- c ) yield E kifejezés típusa?

    List[U]. Válasz mutatása

  • A foreach alapján mire alakítja át a Scala fordító a for ( x <- c ) yield E akakú kifejezéseket?

    c.map( { x => E} ). Válasz mutatása

  • Vajon ha egy saját osztályban implementáljuk a megfelelő szignatúrájú map metódust, akkor használhatunk rajta for yield comprehensiont is?

    Természetesen, ez is ,,ingyen'' jön, mint ahogy a foreach-hoz is a yield nélküli for comprehension. Próbáljuk ki a saját listánk mapjével! Válasz mutatása


Utolsó frissítés: 2020-12-24 17:03:27