当我们在dart中使用map函数时,我不太清楚执行顺序。
例如,下面的代码(这个例子可能很琐碎,但我只想说明我的问题)
这是试图将标题列表转换为包含所有标题的字符串。
var moviesTitles = ['Inception', 'Heat', 'Spider Man'];
moviesTitles.map((title) => title).join('\n')所以,我不确定我的理解中哪一个是正确的
或
1.起始+“\n”
2.Heat+ '\n‘
3.蜘蛛侠+“\n”
最后,盗梦空间+ '\n‘+ Heat+ '\n’+蜘蛛侠+ '\n‘
我发现理解2号更有意义,但在地图之后显示.join的语法似乎不符合这个逻辑
发布于 2021-05-27 20:12:00
map函数是惰性的。因此,调用titles.map((title) => title)立即创建一个新的Iterable,它包装列表titles和函数(title) => title。
然后在可迭代性上调用.join('\n')。它没有具体说明它是做什么的,每个平台都可以有自己的join实现,但是我们知道它迭代它被调用的可迭代性,方法是获得.iterator,然后调用该迭代器的.moveNext()并得到它的.current,直到它有它的所有值。
迭代titles.map(...)可迭代将迭代titles。因为titles是一个列表,所以它可能优化为只按索引访问成员。当迭代器被要求获得一个值(使用moveNext,然后使用current)时,它将得到titles的下一个元素,并使用它调用(title) => title,然后提供它的值current。当他们被要求的时候,一个接一个。
join调用获取这些字符串,并以某种方式将它们与\n字符串组合。可以是StringBuffer,也可以是列表,也可以是非平台代码不可用的内部功能(比如直接写入分配的字符串)。我们可能永远也不会知道。(剧透,这是一个StringBuffer)。
发布于 2021-05-27 07:59:13
简短答案:第一变体
根据文件:
可迭代映射(T函数(字符串) f)
返回一个新的惰性Iterable,元素是通过对这个Iterable的每个元素按迭代顺序调用f创建的。
此方法返回映射元素的视图。只要返回的Iterable不被迭代,所提供的函数f就不会被调用。转换后的元素不会被缓存。在返回的Iterable上多次迭代将在同一元素上多次调用提供的函数f。
返回的迭代中的方法可以省略对不需要结果的任何元素调用f。例如,elementAt可能只调用f一次。
字符串联接(字符串分隔符= "")
将每个元素转换为字符串并连接字符串。
迭代此可迭代的元素,通过调用Object.toString将每个字符串转换为字符串,然后将字符串连接起来,分隔符字符串在元素之间交错。
https://stackoverflow.com/questions/67717389
复制相似问题