【问题标题】:How to convert between java to scala datatype nested如何在 java 到嵌套的 scala 数据类型之间转换
【发布时间】:2019-02-03 15:32:44
【问题描述】:

我有一个返回 List<String[]> 的函数,我可以修改它以返回其他内容,按比例计算,我正在调用的函数期望输入为:Seq[Product]

我收到以下错误:

[scalac-2.11]  found   : List[Array[String]]
[scalac-2.11]  required: Seq[Product]

我是 scala 的新手,我该怎么做?

我需要调用的 api 需要如下输入:

 Seq( ("id", "string", "id", "string"), ("my_date", "string", "my_date", "string") )) ) 

【问题讨论】:

  • 您预期的数据类型是Product 似乎很奇怪。这是一个非常基础的数据类型,非常接近Any(Scala 等效于Object)。你确定Product是你想要的输入类型吗?
  • 我是一个胶水 api,它期望输入以下格式: applyMapping( Seq( ("id", "string", "id", "string"), ("my_date", "字符串”,“我的日期”,“字符串”))))

标签: java scala scala-collections


【解决方案1】:

您需要将数组转换为Tuple4s。如果您可以保证您的数组的大小始终为 4,并假设它们的顺序与元组所需的顺序相同,那么您可以简单地这样做:

myList.map(arr => (arr(0), arr(1), arr(2), arr(3)))

但是,如果您不能保证您的数组大小为 4,或者如果数组元素相对于元组要求是无序的,那么您将不得不做一些额外的工作来处理这些情况。

【讨论】:

    【解决方案2】:

    您需要 transform List[Array[String]] => List[scala.Product] 以匹配您正在调用的 api 的输入类型。

    说,你的 api 看起来像:

    scala> def glueApi(data: Seq[Product]) = "do something"
    glueApi: (data: Seq[Product])String
    

    转换:List[Array[String]] => List[scala.Product]

    scala> val data = List(Array("id", "001", "id2", "002"), Array("date1", "data1", "date2", "data2"))
    data: List[Array[String]] = List(Array(id, 001, id2, 002), Array(date1, data1, date2, data2))
    
    scala> val dataProducts:List[Product] = data.map { case Array(a, b, c, d) => (a, b, c, d) }
    dataProducts: List[Product] = List((id,001,id2,002), (date1,data1,date2,data2))
    

    调用api:

    scala> glueApi(dataProducts)
    res3: String = do something
    

    注意: TupleNProductN 的实现。 - https://www.scala-lang.org/api/2.12.6/scala/Tuple4.html

    case class Tuple4[+T1, +T2, +T3, +T4](_1: T1, _2: T2, _3: T3, _4: T4)
      extends Product4[T1, T2, T3, T4]
    {
      override def toString() = "(" + _1 + "," + _2 + "," + _3 + "," + _4 + ")"
    
    }
    

    【讨论】:

      【解决方案3】:

      假设 Arrays 的每个固定大小为 4(基于您的示例数据),对于列表中的每个 Arrays,您可以使用模式匹配将 Array 元素提取到 @ 987654325@:

      import scala.collection.JavaConverters._
      import scala.collection.mutable.ArrayBuffer
      
      val arrList: java.util.List[Array[String]] = ArrayBuffer(
          Array("id", "string", "id", "string"),
          Array("my_date", "string", "my_date", "string")
        ).asJava
      // arrList: java.util.List[Array[String]] = [[Ljava.lang.String;@1f50fe84, [Ljava.lang.String;@3380313d]
      
      val productList: Seq[Product] = arrList.asScala.
        map{ case Array(s1, s2, s3, s4) => (s1, s2, s3, s4) }
      // productList: Seq[Product] = ArrayBuffer(
      //   (id,string,id,string), (my_date,string,my_date,string)
      // )
      

      请注意,Tuple4Product4 的规范表示,它又扩展了 Product。对于 Java 和 Scala 集合之间的常见转换,这里有一个相关的doc

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-27
        • 1970-01-01
        • 2012-12-08
        • 2020-08-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多