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 编写此代码的最佳方式是什么?
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))
受 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 中被删除吗?