С первого раза прочитал это:
for {
harpo<-list1 if harpo.length>0
groucho<-list2
chico<-list3
} yield (harpo, groucho, chico)
переводится на:
list1.filter(_.length>0).flatMap(harpo =>
list2.flatMap(groucho=>list3.map((harpo,groucho,_)))
)
Меня беспокоили ненужные промежуточные коллекции, возвращаемые filter
, flatMap
& map
. Первый был исправлен в Scala 2.8 (?) Путем добавления метода withFilter
, и я подозреваю, что происходит какая-то магия, которая изменяет тип возвращаемого значения этих методов в зависимости от использования, поэтому при использовании в качестве параметра для flatMap
они возвращают не- строгий сбор, но я не могу найти никаких доказательств. Верны ли мои подозрения и не так ли неэффективно, как кажется на первый взгляд?