【问题标题】:convert the type of value in a Map - Scala转换 Map 中值的类型 - Scala
【发布时间】:2017-10-04 21:23:02
【问题描述】:

我正在尝试将 Map 的值类型从 Any 转换为 Scala 中的 String。

我有这样的代码

import scala.collection.generic.CanBuildFrom


case class Name(FristName: String,LastName: String)

object App29 extends App {


  val name = Name("mark","aden")


  val stringListBuilder = new CanBuildFrom[List[Any], String, List[String]] { def apply(from: List[Any]) = this.apply(); def apply() = List.newBuilder[String] }

  val result = name.getClass.getDeclaredFields.map(_.getName)
    .zip(name.productIterator.toList)(stringListBuilder).toMap


}

所以我使用 CanBuilderForm 基本上将返回类型从 Map[String,Any] 转换为 Map[String,String] 但我不明白为什么它会引发类型不匹配错误。

谢谢

编辑-1

我发现我可以使用 name.productIterator.map(_.toString) 将其转换为字符串,但我想知道为什么我的 CanBuildFrom 语法错误以及如何错误。

【问题讨论】:

  • 您可能对这个Scala-lang blog 感兴趣。从本质上讲,Scala 将不再在其正在进行的语言设计中使用 CanBuildFrom

标签: scala


【解决方案1】:

这不是 CanBuildFrom 的设计用途。 CanBuildFrom 旨在简化新集合类型的实现。这意味着像map 这样的方法可以在特征GenTraversableLike 上定义,并且仍然能够返回特定集合的类型,而不必在ListVector 等每个子类型上覆盖它,因为它为特定集合使用CanBuildFrom 构建器,因此可以通用地执行操作。

以上述方式使用 CanBuildFrom 只会让任何阅读您的代码的人完全混淆,这根本不是惯用的,应该避免 - 如果我看到 CanBuildFrom 被用于这样的用途,我将永远不会通过代码审查一种方式,如果您没有准确解释您想要实现的目标并展示如何以另一种方式实现它的示例,那么即使代码确实编译和工作。一般来说,如果你真的知道你在做什么,你应该只使用CanBuildFrom 实例,并且只在想要提供可重用功能的实用程序库和框架中深入,它几乎不应该出现在应用程序代码中。在我 6 年的 Scala 开发中,我从来不需要实现我自己的 CanBuildFrom,而且我只编写了两次实际上对 CanBuildFrom 实例执行某些操作的代码。

至于你的代码为什么不能编译,zip 需要一个CanBuildFrom,它的第二个参数是一个元组,是原集合的类型,和你传入的集合的类型,即你应该提供CanBuildFrom[List[Any], (String, Any), List[(String, String)]]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-15
    • 1970-01-01
    • 2017-07-14
    • 1970-01-01
    相关资源
    最近更新 更多