2010-02-07 23 views
20

Bir Liste (1, "1") aldığınızı varsayalım, bu liste doğru ve beklenen bir şekilde yazılmıştır. Şimdi listeyi buScala toplama tipi filtre için

ile eşlerseniz, sonuçta beklenen tür [Int] de beklenir. Sorum şu: Filtre için eşlenecek bir eşdeğer varsa, aşağıdaki örnek bir Liste [Any] ile sonuçlanacaktır. Mümkün mü? Bunun derleme zamanında çözülebileceğini ve muhtemelen çalışma zamanı olmadığını söyleyebilirim.

scala> List(1, "1") filter { 
    | case x: Int => true 
    | case _ => false 
    | } 

cevap

24

Scala 2.9: basitçe partialFunction içeren durumunda bir bekçi kullanırsanız

değiştirilen soruya ilişkin olarak
scala> List(1, "1") collect { 
    | case x: Int => x 
    | } 
res0: List[Int] = List(1) 
1

, elde edersiniz filtreleme: herkes için

scala> val l1 = List(1, 2, "three", 4, 5, true, 6) 
l1: List[Any] = List(1, 2, three, 4, 5, true, 6) 

scala> l1.partialMap { case i: Int if i % 2 == 0 => i } 
res0: List[Int] = List(2, 4, 6) 
+0

Bu neden olduğunu sadece bir bekçi ile mümkün mü? –

+0

Üzgünüz, bu çok aptalca bir yorumdu. Ama neden filter() partialMap gibi bir sonuç üretmiyor? –

+1

@Joa 'filter' bir koleksiyonun türünü değiştirmez, çünkü öğelerini değiştirmez. –

6

Bu soru karşısında, en çok oy alan cevabın neden işe yaramadığını merak ederek, partialMap yönteminin Scala 2.8 finalinden önce collect yeniden adlandırıldığını unutmayın. serbest bırakmak. Bunun yerine bu deneyin:

scala> List(1, "1") collect { 
    | case x: Int => x 
    | } 
res0: List[Int] = List(1) 

(. Bu gerçekten Daniel C. Sobral en aksi-harika cevap bir yorum olmalı, ama yeni bir kullanıcı olarak henüz yorum için izin yok)