Neben der hervorragenden Antwort von Shadowlands möchte ich ein intuitives Beispiel für den Unterschied zwischen filterund geben withFilter.
Betrachten wir den folgenden Code
val list = List(1, 2, 3)
var go = true
val result = for(i <- list; if(go)) yield {
go = false
i
}
Die meisten Menschen erwarten result, gleich zu sein List(1). Dies ist seit Scala 2.8 der Fall, weil das Verständnis in übersetzt wird
val result = list withFilter {
case i => go
} map {
case i => {
go = false
i
}
}
Wie Sie sehen können, wandelt die Übersetzung die Bedingung in einen Aufruf von um withFilter. Vor Scala 2.8 wurde das Verständnis in Folgendes übersetzt:
val r2 = list filter {
case i => go
} map {
case i => {
go = false
i
}
}
Mit wäre filterder Wert von resultziemlich unterschiedlich : List(1, 2, 3). Die Tatsache, dass wir das goFlag erstellen, falsehat keine Auswirkung auf den Filter, da der Filter bereits fertig ist. Auch in Scala 2.8 wird dieses Problem mit gelöst withFilter. Bei withFilterVerwendung wird die Bedingung jedes Mal ausgewertet, wenn auf ein Element innerhalb einer mapMethode zugegriffen wird.
Referenz : - S.120, Scala in Aktion (Cover Scala 2.10), Manning Publications, Milanjan Raychaudhuri - Oderskys Gedanken zur Übersetzung zum Verständnis