2017-03-07 38 views
0

我有一个需求,我需要根据List的数据类型执行一些转换集。让我说如果我得到List[String]我需要应用一些转换,但如果我得到List[Int]需要应用一些不同的转换。我已经定义了一个函数,它将采取List[Any]和我需要检查数据类型的匹配语句。我试图使用isInstanceOf但它没有解决。找到列表中的数据类型

如何检查List的数据类型。

+0

邮政代码片段显示使用你试过什么。长话短说,你可以使用简单的类型模板来做到这一点,或者如果你需要更强大的功能,可以单独使用'Cats'或'Scalaz'来完成。 – sebszyller

+0

不是没有反思,这是丑陋和缓慢。您需要在[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

回答

2

假设您的列表具有相同类型的所有元素,并使用纯斯卡拉你可以做这样的事情:

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) 
+0

谢谢...它部分解决了我的问题 –

+1

@ishan没问题,我没有看到问题的第二部分看着你的问题,但我希望你会找到答案:) –