Scala ima skraćenu notaciju za pisanje komprehensija sekvenci.
Komprehensije imaju oblik
for (enumeratori) yield e
, gdje su enumeratori
lista enumeratora razdvojenih tačka-zarezima.
Enumerator je ili generator koji uvodi nove varijable, ili je filter.
Komprehensija evaluira tijelo e
za svako vezivanje varijable generisano od strane enumeratora i vraća sekvencu ovih vrijednosti.
Slijedi primjer:
case class User(name: String, age: Int)
val userBase = List(User("Travis", 28),
User("Kelly", 33),
User("Jennifer", 44),
User("Dennis", 23))
val twentySomethings = for (user <- userBase if (user.age >=20 && user.age < 30))
yield user.name // i.e. add this to a list
twentySomethings.foreach(name => println(name)) // prints Travis Dennis
for
petlja korištena s yield
-om ustvari kreira List
-u. Pošto smo rekli yield user.name
, to je List[String]
. user <- userBase
je naš generator a if (user.age >=20 && user.age < 30)
je čuvar koji filtrira korisnike koji su u svojim dvadesetim.
Slijedi malo komplikovaniji primjer koji s dva generatora. Izračunava sve parove brojeva između 0
i n-1
čija je suma jednaka vrijednosti v
:
def foo(n: Int, v: Int) =
for (i <- 0 until n;
j <- i until n if i + j == v)
yield (i, j)
foo(10, 10) foreach {
case (i, j) =>
print(s"($i, $j) ") // prints (1, 9) (2, 8) (3, 7) (4, 6) (5, 5)
}
Ovdje je n == 10
i v == 10
. U prvoj iteraciji, i == 0
i j == 0
tako da i + j != v
i ništa se ne vraća. j
se povećava 9 puta prije nego se i
poveća na 1
.
Bez if
čuvara, ovo bi ispisalo sljedeće:
(0, 0) (0, 1) (0, 2) (0, 3) (0, 4) (0, 5) (0, 6) (0, 7) (0, 8) (0, 9) (1, 0) ...
Contributors to this page:
Contents
- Uvod
- Osnove
- Sjedinjeni tipovi
- Klase
- Podrazumijevane vrijednosti parametara
- Imenovani parametri
- Trejtovi
- Tuples
- Kompozicija mixin klasa
- Funkcije višeg reda
- Ugniježdene metode
- Curry-jevanje
- Case klase
- Podudaranje uzoraka (pattern matching)
- Singlton objekti
- Regularni izrazi
- Ekstraktor objekti
- For komprehensije
- Generičke klase
- Varijanse
- Gornja granica tipa
- Donja granica tipa
- Unutarnje klase
- Apstraktni tipovi
- Složeni tipovi
- Self-tipovi
- Implicitni parametri
- Implicitne konverzije
- Polimorfne metode
- Lokalno zaključivanje tipova (type inference)
- Operatori
- By-name parametri
- Anotacije
- Packages and Imports
- Package Objects