在 Scala 中编写 `indexBy` 的最佳方式是什么?

问题描述 投票:0回答:2

Underscore.js 有一个函数 indexBy,它执行以下操作:

给定一个列表,以及一个为每个列表返回一个键的 iteratee 函数 列表中的元素(或属性名称),返回一个带有 每个项目的索引。就像 groupBy 一样,但是当你知道你的密钥时 是独一无二的。

var stooges = [{name: 'moe', age: 40}, {name: 'larry', age: 50}, {name: 'curly', age: 60}];
_.indexBy(stooges, 'age');
=> {
  "40": {name: 'moe', age: 40},
  "50": {name: 'larry', age: 50},
  "60": {name: 'curly', age: 60}
}

用 Scala 编写此代码的最佳方式是什么?

algorithm scala
2个回答
1
投票
final case class Stooge(name: String, age: Int)

val stooges = Seq(Stooge("moe", 40), Stooge("larry", 50))

val result = stooges.map(s => s.age -> s).toMap

println(result)
// Map(40 -> Stooge(moe,40), 50 -> Stooge(larry,50))

0
投票

受 danielnixon 的回答启发,可重用版本(Scala 3):

extension [T](ts: Iterable[T]) {
  def indexBy[K](f: T => K): Map[K, T] =
    ts.map(t => f(t) -> t).toMap
}

val byAge = stooges.indexBy(_.age)

另外,我可以从几年前的 Scala 2 使用中发誓,Scala 在标准库中的某个位置(在 IterableOps 或类似库中)包含上述内容,但我找不到它。它可以在 Scala 3 中被删除吗?

© www.soinside.com 2019 - 2024. All rights reserved.