转换映射中的值类型-Scala
我正在尝试将Map的值类型从Any转换为Scala中的字符串 我有这样的代码转换映射中的值类型-Scala,scala,Scala,我正在尝试将Map的值类型从Any转换为Scala中的字符串 我有这样的代码 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
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(u.toString)将其转换为字符串,但我想知道为什么我的CanBuildFrom语法是错误的,以及如何错误的。这不是
CanBuildFrom
的设计目的CanBuildFrom
旨在简化新集合类型的实现。这意味着可以在traitGenTraversableLike
上定义map
等方法,并且仍然能够返回特定集合的类型,而不必在每个子类型(如List
和Vector
等)上覆盖它,因为它对特定集合使用了CanBuildFrom
builder,因此可以一般地执行操作
以上述方式使用CanBuildFrom
只会让任何阅读您的代码的人完全困惑,这根本不是惯用语,应该避免-如果我看到CanBuildFrom
以这种方式使用,我永远不会通过代码审查,如果您没有准确地解释您试图实现的目标,并展示一个如何以另一种方式实现的示例,那么即使代码确实编译并工作,我也会花很长时间来了解代码在做什么。一般来说,如果您真的知道自己在做什么,您应该只使用CanBuildFrom
实例,并且只在希望提供可重用功能的实用程序库和框架中使用,它几乎不应该出现在应用程序代码中。在我6年的Scala开发中,我从未需要实现自己的CanBuildFrom
,而且我只编写过两次代码,实际使用CanBuildFrom
实例执行某些操作
至于你的代码为什么不编译,
zip
需要一个CanBuildFrom
,它的第二个参数是原始集合类型的元组,以及你要传递的集合类型,也就是说,你应该提供一个CanBuildFrom[List[Any],(String,Any),List[(String,String)]]
这不是可以构建的
的设计目的CanBuildFrom
旨在简化新集合类型的实现。这意味着可以在traitGenTraversableLike
上定义map
等方法,并且仍然能够返回特定集合的类型,而不必在每个子类型(如List
和Vector
等)上覆盖它,因为它对特定集合使用了CanBuildFrom
builder,因此可以一般地执行操作
以上述方式使用CanBuildFrom
只会让任何阅读您的代码的人完全困惑,这根本不是惯用语,应该避免-如果我看到CanBuildFrom
以这种方式使用,我永远不会通过代码审查,如果您没有准确地解释您试图实现的目标,并展示一个如何以另一种方式实现的示例,那么即使代码确实编译并工作,我也会花很长时间来了解代码在做什么。一般来说,如果您真的知道自己在做什么,您应该只使用CanBuildFrom
实例,并且只在希望提供可重用功能的实用程序库和框架中使用,它几乎不应该出现在应用程序代码中。在我6年的Scala开发中,我从未需要实现自己的CanBuildFrom
,而且我只编写过两次代码,实际使用CanBuildFrom
实例执行某些操作
至于你的代码为什么不编译,zip
需要一个CanBuildFrom
,它的第二个参数是原始集合类型的元组,以及你要传递的集合类型,也就是说,你应该提供一个CanBuildFrom[List[Any],(String,Any),List[(String,String)]]
您可能对此感兴趣。从本质上讲,Scala将不再在其正在进行的语言设计中使用CanBuildFrom
,这可能会引起您的兴趣。本质上,Scala将不再在其正在进行的语言设计中使用CanBuildFrom
。