[英]find the data type in List
我有一个需求,我需要根据List
的数据类型执行一些转换。 可以说,如果我得到List[String]
我需要应用一些转换,但是如果我得到List[Int]
需要应用一些不同的转换。 我已经定义了一个将使用List[Any]
的函数,并且需要使用match语句检查数据类型。 我尝试使用isInstanceOf
但没有成功。
如何检查List
的数据类型。
假设列表的所有元素都具有相同的类型,并使用普通的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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.