【问题标题】:Dart: mapping a list of string into a stringDart:将字符串列表映射为字符串
【发布时间】:2021-08-15 10:24:52
【问题描述】:

当我们在 dart 中使用 map 函数时,我不太明白执行顺序

例如下面的代码(这个例子可能很简单,但我只是想说明我的问题)

这是试图将标题列表转换为包含所有标题的字符串

var moviesTitles = ['Inception', 'Heat', 'Spider Man'];

moviesTitles.map((title) => title).join('\n')

所以,我不确定我的理解是否正确

  1. 首先,map 函数将 (title) => title 应用于每个项目,然后将它们合并到一个新列表中,然后将它们与 \n

或者

  1. map 函数将在每个项目上应用 (title) => title,并且在每个循环中,将其附加到 \n ;然后仅在最后将它们合并为一个字符串。 顺序如下图所示

1.Inception + '\n'

2.Heat+ '\n'

3.蜘蛛侠+'\n'

最后,盗梦空间 + '\n' + Heat+ '\n' + 蜘蛛侠 + '\n'

我发现理解 no.2 更有意义,但似乎在 map 后显示 .join 的语法与此逻辑不匹配

【问题讨论】:

  • 在这种情况下,.map() 调用毫无意义。代码可能只是moviesTitles.join('\n')
  • 我知道,正如我在问题中所说,这个例子可能很简单,但我只是想说明我的问题是执行顺序

标签: dictionary dart


【解决方案1】:

简答:第一个变体

根据文档:

可迭代映射(T Function(String) f)

返回一个新的惰性 Iterable,其中包含通过按迭代顺序对该 Iterable 的每个元素调用 f 创建的元素。

此方法返回映射元素的视图。只要返回的 Iterable 没有被迭代,提供的函数 f 就不会被调用。转换后的元素不会被缓存。对返回的 Iterable 进行多次迭代将在同一个元素上多次调用提供的函数 f。

允许返回的可迭代对象上的方法在不需要结果的任何元素上省略调用 f。例如,elementAt 可能只调用 f 一次。

字符串连接([字符串分隔符 = ""])

将每个元素转换为字符串并连接字符串。

遍历此可迭代对象的元素,通过调用 Object.toString 将每个元素转换为字符串,然后连接字符串,其中分隔符字符串在元素之间交错。

【讨论】:

    【解决方案2】:

    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)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多