【问题标题】:In Scala how do you call toMap on a List of a case class?在 Scala 中,如何在案例类的列表上调用 toMap?
【发布时间】:2022-02-01 07:36:12
【问题描述】:

我希望能够在案例类的列表上调用 toMap:

case class Properties(name: String, value: String)

val lst = List(Properties("name1", "val1"))
lst.toMap

这行不通,因为没有隐含的证据 Properties <:< (T,U) 所以我将列表映射到 List[(String,String)] 然后调用 toMap。 没有地图还有办法做到这一点吗?

【问题讨论】:

  • 我很确定以前有人问过这个问题,我回答了,但我找不到。 - 无论如何,您可能会提供虚假的证据,但这可能会带来更多的麻烦而不是好处。我只会使用view / iterator 来折叠map 调用。
  • 谢谢@LuisMiguelMejíaSuárez 只是好奇是否可以使用 <: evidence>
  • @SwiftMango 你知道怎么做吗?
  • 实际上不可能做到这一点。这是一个密封类。您应该使用视图和映射到元组

标签: scala


【解决方案1】:

一般来说,您需要将案例类转换为Tuple2

如果您的 case class 恰好有 2 个字段并且您想键入第一个字段,则已经有一个可用的转换:伴随对象的 unapply 方法:

case class Properties(name: String, value: String)

val lst = List(Properties("name1", "val1"))
lst.view.flatMap(Properties.unapply).toMap

【讨论】:

  • 这绝对有效,但lst.view.map(p =&gt; (p.name, p.value)).toMap 可能更易于阅读,并且涉及类似数量的输入和计算。
  • 其实我就是这样做的。我很想知道是否有一些巧妙的方法可以通过隐含的证据来做到这一点,但是因为 Tuple2 是最终的,所以没有办法做到这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多