簡體   English   中英

在列表中找到數據類型

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM