我有一個需求,我需要根據List
的數據類型執行一些轉換集。讓我說如果我得到List[String]
我需要應用一些轉換,但如果我得到List[Int]
需要應用一些不同的轉換。我已經定義了一個函數,它將採取List[Any]
和我需要檢查數據類型的匹配語句。我試圖使用isInstanceOf
但它沒有解決。找到列表中的數據類型
如何檢查List
的數據類型。
我有一個需求,我需要根據List
的數據類型執行一些轉換集。讓我說如果我得到List[String]
我需要應用一些轉換,但如果我得到List[Int]
需要應用一些不同的轉換。我已經定義了一個函數,它將採取List[Any]
和我需要檢查數據類型的匹配語句。我試圖使用isInstanceOf
但它沒有解決。找到列表中的數據類型
如何檢查List
的數據類型。
假設您的列表具有相同類型的所有元素,並使用純斯卡拉你可以做這樣的事情:
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沒問題,我沒有看到問題的第二部分看着你的問題,但我希望你會找到答案:) –
郵政代碼片段顯示使用你試過什麼。長話短說,你可以使用簡單的類型模板來做到這一點,或者如果你需要更強大的功能,可以單獨使用'Cats'或'Scalaz'來完成。 – sebszyller
不是沒有反思,這是醜陋和緩慢。您需要在[ADT](http://typelevel.org/blog/2014/11/10/why_is_adt_pattern_matching_allowed.html)或[HLists](https://github.com/milessabin)中捕獲類型信息/shapeless/wiki/Feature-overview:-shapeless-2.0.0#polymorphic-function-values) – Reactormonk