据我所知,for
表达式被翻译成Scala表达式,这些表达式构建于:
高阶列表方法。
一个常见的例子是:
for(b1 <= books; b2 <- books if b1 != b2;
a1 <- b1.authors; a2 <- b2.authors if a1 == a2) yield a1;
结果:
books flatMap (b1 =>
books withFilter( b2 => b1 != b2) flatMap( b2 =>
b1.authors flatMap ( a1 =>
b2.authors withFilter ( a2 => a2 == a1 ) map ( a2 => a1 )
)
)
)
其中:
books
是一个类Book
对象列表(List[Book]
)Book
的公开属性authors
类型为List[String]
我的问题是关于这一行:
b2.authors withFilter ( a2 => a2 == a1 ) map ( a2 => a1 )
由于条件为a2 == a1
,该行等同于:
b2.authors withFilter ( a2 => a2 == a1 ) map ( x => x )
为什么生成的代码不仅仅是?
b2.authors filter ( a2 => a2 == a1 )
可以解释一下这个例子是Scala编译器自动生成的代码的再现吗?
“建筑砖块”中有filter
吗?
答案 0 :(得分:1)
将for
/ yield
语法转换为方法调用非常简单和机械,几乎处于字符串操作的级别。 withFilter
因其懒惰而在某些地方是必要的,因此为了简单起见,它在各地都被使用。我不明白你的最后一个问题的措辞,但是for
/ yield
表达式是AIUI从未转换为对filter
的调用,除了对于尚未拥有的对象的弃用方式withFilter
方法。