这是一个关于 Scala 编译器的问题。
假设我有一个列表,并且我通过几个地图和平面地图来转换该列表。
val myList = List(1,2,3,4,5)
val transformed = myList.map(_+1).map(_*2).flatmap(x=>List(x-1,x,x+1))
假设我再对其进行一些改造。
val moreTransformed = transformed.map(_-2).map(_/5).flatMap(x=>List(x/2,x*2))
我的问题可以分为两部分
为 生成 val 时
transformed
,底层 Java 字节码是否创建中间列表?我指的是在计算中对 map 和 flatMap 的连续调用transformed
。Scala 编译器可以将这些调用组合成一个 flatMap 吗?如果我在对象列表上进行操作,这将需要创建更少的中间对象。如果编译器是幼稚的并且只是创建中间对象,那么这可能会导致涉及长链 map 和 flatMap 的计算的相当大的开销。假设在上面创建的两个 val 中,我仅
moreTransformed
在进一步计算中使用(第二个 val)。也就是说,我只transformed
在计算中使用(第一个val)moreTransformed
而没有其他地方。Scala 编译器是否足够聪明,不会transformed
只为和计算创建列表moreTransformed
?transformed
将所有函数组合在and中是否足够聪明,moreTransformed
从而只生成一个 List,即 的值moreTransformed
?