首页 > 解决方案 > 避免在 Scala 中调用 .toMap 之前转换为中间数据结构

问题描述

让我们考虑以下代码:

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

解决方案


您可以使用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:如何从 Set[K] 创建 Map[K,V] 和从 K 到 V 的函数?


推荐阅读