【问题标题】:find the data type in List在 List 中查找数据类型
【发布时间】:2017-03-07 21:19:49
【问题描述】:

我有一个要求,我需要根据List 的数据类型执行一些转换。假设我得到List[String],我需要应用一些转换,但如果我得到List[Int],则需要应用一些不同的转换。我已经定义了一个函数,它将采用 List[Any] 并使用 match 语句我需要检查数据类型。我尝试使用isInstanceOf,但没有成功。

如何查看List的数据类型。

【问题讨论】:

  • 邮政编码 sn-ps 显示使用您尝试过的内容。长话短说,如果您需要更强大的功能,您可以使用简单的类型模板,甚至可以使用 CatsScalaz 单子完成。
  • 不是没有反射,又丑又慢。您需要在 ADTHLists 中捕获类型信息

标签: scala apache-spark


【解决方案1】:

假设您的列表在其所有元素中具有相同的类型并使用普通的 Scala,您可以执行以下操作:

def test(list: List[Any]): List[Any] = {
  if(list.isEmpty) return List()
  list.head match {
    case a: String => list.map(str => str.asInstanceOf[String]+"3")
    case a: Int => list.map(int => int.asInstanceOf[Int]+3)
  }
}

这不是最好的解决方案,但我看不出没有其他库可以使用的其他任何东西

这里有一个更奇怪的解决方案,它允许您返回与该函数完全相同的类型,当然您需要在列表的每个元素中具有完全相同的类型:

def test[T](list: List[T]): List[T] = {
  if(list.isEmpty) return List()
  list.head match {
    case a: String => list.map(str => (str.asInstanceOf[String]+"3").asInstanceOf[T])
    case a: Int => list.map(int => (int.asInstanceOf[Int]+3).asInstanceOf[T])
  }
}

test(List("123","123")) // res0: List[String] = List(1233, 1233)
test(List(1,2,3)) // res1: List[Int] = List(4, 5, 6)

再次编辑,最后但并非最不重要的一点是,您可以使用 TypeTag 来避免类型擦除和检查列表类型,如下所示:

def test1[T: TypeTag](list: List[T]): List[T] = typeOf[T] match {
  case t if t =:= typeOf[String] => list.map(str => (str.asInstanceOf[String]+"3").asInstanceOf[T])
  case t if t =:= typeOf[Int] => list.map(int => (int.asInstanceOf[Int]+3).asInstanceOf[T])
  case _ => list
}

test1(List("123", "123", "123")) // Strings so: res0: List[String] = List(1233, 1233, 1233)
test1(List("123","123", 1)) // Oh-oh we have not defined type, so: res1: List[Any] = List(123, 123, 1)
test1(List(1,2,3)) // And here we have res2: List[Int] = List(4, 5, 6)

【讨论】:

  • @ishan 没问题,我看不到你的问题的第二部分,但我希望你能找到答案:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多