【问题标题】:Avoid having to convert to an intermediate data-structure before calling .toMap in Scala避免在 Scala 中调用 .toMap 之前转换为中间数据结构
【发布时间】:2019-08-14 06:27:52
【问题描述】:

让我们考虑以下代码:

Set(1, 2, 3, 4, 5)
  .map(k => (k, if (k % 2 == 0) "even" else "odd"))
  .toMap

有没有办法在 Scala 中简化这一点,避免创建中间集?我将在大型集合上做一些对性能敏感的事情,而不是在现场创建 Map 并没有什么坏处。

如果没有更好的结果,我正在考虑最终实现这样的东西:

Map.from(S, k => if (k % 2 == 0) "even" else "odd"))

我仍在使用 Scala 2.12。

谢谢

【问题讨论】:

  • 可以使用scala.collection.breakOut

标签: scala


【解决方案1】:

你可以使用foldleft

(1 to 5).foldLeft(Map.empty[Int, String])(
  (r, k) => r + (k -> (if (k % 2 == 0) "even" else "odd"))
)

编辑

或者,为了避免toMap 方法中的中间收集,您可以使用view

(1 to 5).view
  .map(k => (k, if (k % 2 == 0) "even" else "odd"))
  .toMap

Scala: How to create a Map[K,V] from a Set[K] and a function from K to V?

【讨论】:

  • 我非常同意,我真的更喜欢 toMap 方法!这只是一个替代方案,不确定是否最好......
  • 我已将视图选项添加到我的答案中。它可能会回答您关于“中间集”问题的问题。
  • 已编辑无类型归属
  • 因为在这种情况下性能是一个要求,并且view 没有被重用。最好使用iterator 代替(这样代码在2.11 2.12 和2.13 中也是正确的)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-27
  • 1970-01-01
  • 1970-01-01
  • 2018-01-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多