3
从第一次读的是:Scala的用于推导和flatMap /地图中间结果
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
。第一个通过添加withFilter
方法在Scala 2.8(?)中得到修复,我怀疑有一些魔法会根据使用情况改变这些方法的返回类型,因此当用作参数flatMap
时,严格收集,但我找不到任何证据。我的怀疑是否正确,并不像乍看起来那么无效?
也许我应该更清楚。我的问题是:在这种情况下,list3.map和list2.flatMap返回的集合是否严格?如果他们是严格的,那么他们会被重复建造,以便在将他们的元素放入父集合后丢弃。如果我只是'val l = list3.map(“brother”+ _)'我得到一个严格的收集。在这种情况下,一个典型的C++模式是使用一个惰性中间类型,当它被分配给期望返回类型的变量时,它会隐式转换为严格类型。我不知道在scala中是否可能,但它的类型推断对我来说仍然有秘密。 – Turin
'list2'和'list3'可能是严格的(你没有指定它们的类型,但是假设它们的类型是'List'),所以内部循环创建严格的中间结果。我不知道C++集合,但是我怀疑你可以用一种懒惰的方式嵌套'flatMaps',以消除任何中间集合 - __'map'__和__'filter'__是,但不是__'flatMap'__。如果你想要,使用builder和'foreach'的迭代方法。正如我所说,不要被过早的优化所困扰。 –