scala - 使用 map 函数连接 JValue

scala - using map function to concatenate JValue

我最近开始使用 Scala,可能遗漏了一些关于 map 函数的信息。我知道它 return 是应用给定函数产生的新值。

例如,我有一个 JValue 数组,我想将数组中的每个值与另一个 JValue 连接起来,或者只是将其转换为一个字符串,如下例所示。

val salesArray = salesJValue.asInstanceOf[JArray]
val storesWithSales = salesArray.map(sale => compact(render(sale)) //Type mismatch here
val storesWithSales = salesArray.map(sale => compact(render(sale) + compact(render(anotherJvalue))) //Type mismatch here

正如我所见,存在类型不匹配,因为实际值是一个字符串,预期是 JValue。即使我做 compact(render(sale).asInstanceOf[JValue] 也不允许将字符串转换为 JValue。是否可以 return 与地图函数不同的类型?我如何处理数组值以将它们中的每一个转换为另一种类型?

看一下map方法的类型签名:

def map(f: JValue => JValue): JValue

因此它与其他 map 方法有点不同,因为您必须指定一个 return 类型为 JValue 的函数。这是因为 JArray 特指一棵反序列化的 JSON 树,不能容纳任意对象或数据,只能容纳 JValues.

如果要处理 JArray 的每个值,请先对其调用 .children。这给你一个 List[JValue] 然后有一个更通用的 map 方法,因为 Lists 可以容纳任何类型。它的类型签名是:

def map[B](f: A => B): List[B]

所以你可以这样做:

val storesWithSales = salesArray.children.map(sale => compact(render(sale)))