Scala'nin verimi nedir?
Ruby ve Python getiri anlıyorum. Scala'nın verim ne yapar?
CEVAP
Kabul cevabı harika olduğunu düşünüyorum, ama birçok kişi bazı temel noktaları kavramak için başarısız olmuş gibi görünüyor.
İlk, Scala "" Haskell eşdeğerdir "" gösterim ve çoklu monadic işlemleri kompozisyon için. sözdizimsel bir şeker daha fazla bir şey olup, bu kapsam için. Bu ifade, büyük olasılıkla yardım, yeniden deneyelim ihtiyaç duyan herkes yardımcı olacaktır... :-)
Scala "kapsam" harita ile çoklu işlemler kompozisyon için sözdizimsel şeker, flatMap ve filtre. Ya dosyalarda grup. Scala aslında bu yöntem çağrıları için bir ifade çevirir, herhangi bir sınıf veya bir alt kümesini sağlayan, kapsam için kullanılabilir.
İlk olarak, çeviriler hakkında konuşmak. Çok basit bir kural vardır:
1) Bu
for(x <- c1; y <- c2; z <-c3) {...}
olur çevrildi
c1.foreach(x => c2.foreach(y => c3.foreach(z => {...})))
2) Bu
for(x <- c1; y <- c2; z <- c3) yield {...}
olur çevrildi
c1.flatMap(x => c2.flatMap(y => c3.map(z => {...})))
3) Bu
for(x <- c; if cond) yield {...}
içine Scala 2.7 çevrilir
c.filter(x => cond).map(x => {...})
ya, Scala üzerinde 2.8, içine
c.withFilter(x => cond).map(x => {...})
yöntem eski bir çare ile withFilter
kullanılabilir değil ama filter
. Aşağıda bu konuda daha fazla bilgi için Düzenle bakın lütfen.
4) Bu
for(x <- c; y = ...) yield {...}
olur çevrildi
c.map(x => (x, ...)).map((x,y) => {...})
Kapsam için çok basit baktığınızda, dosyalarda grup alternatif/harita gerçekten daha iyi bak. Bunları oluşturmaya başladığınızda, bir kez olsa da, kolayca parantez ve yuvalama seviyeleri içinde kaybolabilir. Bu durumda, kapsam genellikle çok net olur.
Basit bir örnek göstermek ve kasıtlı olarak herhangi bir açıklama ommit ederim. Anlamak daha kolay olduğunu karar verebilirsiniz.
l.flatMap(sl => sl.filter(el => el > 0).map(el => el.toString.length))
ya
for{
sl <- l
el <- sl
if el > 0
} yield el.toString.length
EDİT
Scala 2.8 bir yöntem, yeni, süzülmüş, bir koleksiyon döndürmek yerine, isteğe bağlı filtreler olan withFilter
denilen tanıttı. filter
yöntem davranışını koleksiyon katılık dayalı olarak tanımladı. Bunu daha iyi anlamak için, hadi List
() katı ve Stream
ile bazı Scala 2.7 bak (non-strict):
scala> var found = false
found: Boolean = false
scala> List.range(1,10).filter(_ % 2 == 1 && !found).foreach(x => if (x == 5) found = true else println(x))
1
3
7
9
scala> found = false
found: Boolean = false
scala> Stream.range(1,10).filter(_ % 2 == 1 && !found).foreach(x => if (x == 5) found = true else println(x))
1
3
Fark found
false
olduğundan filtre hemen List
oranlar listesi dönen uygulandığından -- olur. Ancak o zaman foreach
yürütülür, ama bu kez, found
değişen filter
zaten idam gibi anlamsız.
Stream
Bu durumda hemen uygulanmaz. Bunun yerine, her bir eleman foreach
, filter
tarafından istendiği gibi foreach
etkileme found
ile sağlayan koşul, testler. Sadece açık,-anlama için kod eşdeğer
for (x <- List.range(1, 10); if x % 2 == 1 && !found)
if (x == 5) found = true else println(x)
for (x <- Stream.range(1, 10); if x % 2 == 1 && !found)
if (x == 5) found = true else println(x)
Bu insanlar üzerinde-talep, tüm koleksiyonu önceden uygulanmakta yerine sayılacak if
beklenen çünkü birçok sorunlara yol açtı.
Scala 2.8 olan withFilter
tanıttıher zamanolmayan katı, koleksiyon katılık olursa olsun. Aşağıdaki örnek, Scala 2.8: her iki yöntem ile List
gösterir
scala> var found = false
found: Boolean = false
scala> List.range(1,10).filter(_ % 2 == 1 && !found).foreach(x => if (x == 5) found = true else println(x))
1
3
7
9
scala> found = false
found: Boolean = false
scala> List.range(1,10).withFilter(_ % 2 == 1 && !found).foreach(x => if (x == 5) found = true else println(x))
1
3
Bu insanların çoğu beklediğiniz sonucu, filter
nasıl davranacağını değiştirmeden üretir. Bir yan not olarak, 49* *Scala Scala 2.7 ve 2.8 arasında sıkı olmayan katı olarak değiştirildi.
Scala içinde JavaConverters ve JavaCon...
Scala olarak kullanmak için JSON nedir...
Scala yazın Lambda nedir ve faydaları ...
Nerede Scala implicits durumu nedir?...
Scala atama değeri atanmış yerine Biri...