2012-06-20 16 views

cevap

58

biraz daha az özlü lambda sözdizimi kullanarak::

mystuff = mystuff.filter(x => (x.isX && x.name == "xyz")) 

Sen Scala anonim işlev sözdizimi here ilgili daha fazla ayrıntı bulabilirsiniz

Böyle bir şey istiyorum.

+1

bu, performans ek yükünü ortadan kaldırır mı? Yani son sorguda bu doğru bir şekilde ifade edildi mi? – zinking

4

bazı performans etkisi "MyStuff" ne bağlı olabilir ancak her zaman, sık sık çeşitli yüklemi filtre gerekirse iki kez

mystuff = mystuff.filter(_.isX).filter(_.name == "xyz") 
+0

Bu, tüm listenin çift döngüsüne neden olur. – squixy

+5

@squixy sadece bir FYI, değil. 'filter', koleksiyonun yeni bir projeksiyonunu (veya görünümünü) oluşturur; böylece, bir elemanın yineleme sırasında (yani' map', 'fold', vb.) istenmesi durumunda' filter' (fonksiyonlar) fonksiyonuna uygulanır. öğenin geri dönüp dönmediğine bakın – ThaDon

4

, bunları birleştirmenin bir yolunu tanımlayabiliriz filtre olabilir:

scala> (0 until 20) filter And(_ > 10, _ % 2 == 1) 
res3: scala.collection.immutable.IndexedSeq[Int] = Vector(11, 13, 15, 17, 19) 
: Burada

case class And[A](p1: A=>Boolean, p2: A=>Boolean) extends (A=>Boolean) { 
    def apply(a: A) = p1(a) && p2(a) 
} 

10 daha büyük tek tek sayılar tutmak için nasıl kullanılacağını olduğunu

Or ve Not komütatörler aynı şekilde yazılabilir.