展平scala中的任何
我有 我想将任意列表转换为展平scala中的任何,scala,Scala,我有 我想将任意列表转换为list[Int]。我该怎么做 预期答案是: val a = List(1, List(2,3), 4) 我很确定你在你的代码中做了一些错误的事情。这不是你应该如何使用类型系统。无论如何: List(1,2,3,4) 您不能使用: val a = List(1, List(2,3), 4) a.flatMap({ case i: Int => List(i) case l: List[Int] => l }) 案例l:List[Int]部分由
list[Int]
。我该怎么做
预期答案是:
val a = List(1, List(2,3), 4)
我很确定你在你的代码中做了一些错误的事情。这不是你应该如何使用类型系统。无论如何:
List(1,2,3,4)
您不能使用:
val a = List(1, List(2,3), 4)
a.flatMap({
case i: Int => List(i)
case l: List[Int] => l
})
案例l:List[Int]
部分由于类型擦除而无法工作。事实上:
a.flatMap({
case i: Int => List(i)
case l: List[Int] => l
})
正如您所能看到的,cast[T]
方法通过implicits
无形状添加到每个类型中,如果转换失败,则返回一个选项[T]
,其值为None
,如果转换成功,则返回一个Some
当然,如果第一个列表的内容不是
Int
或list[Int]
,您可以决定失败。在我的示例中,我决定忽略其他类型,仍然生成一个列表[Int]
谢谢。。我是这门语言的初学者,所以我不太擅长打字系统。我正在努力学习。无论如何,非常感谢:)@MahekShah为什么你有一个列表[任何]
?总是尽量避免Any
。有时我在map语句中只使用了一个条件,这就是为什么我得到了Any的列表。。但是现在我知道了第一个过滤条件,然后应用map函数,这样我就可以避免任何类型,而且如果我只想检查if
条件,比如if(list.filter(condition).length>0),然后做一些没有其他部分的事情,那时我得到了任何的列表。有没有办法防止这种情况?@Reactormonk案例l:List[Int]=>l
由于类型擦除而不起作用。我不认为可能是重复的,因为Mahek想从List[Any]
获得一个List[Int]
。相反,该问题询问如何从List[Any]
获取List[Any]
,将List[Any]
转换为任何类型,例如List[Int]
是一种代码气味。你想干什么?如果你在这个列表中没有Int
,你会期望什么行为?@KevinMeredith我只检查一个条件如果,我没有使用ELSE
,这就是为什么我得到“List[Any]”我不明白,Mahek。想再发一个SO问题吗?
scala> val a = List(1, List("a"), 3)
a: List[Any] = List(1, List(a), 3)
scala> a.flatMap {
| case i: Int => List(i)
| case l: List[Int] => l
| }
<console>:11: warning: non-variable type argument Int in type pattern List[Int] (the underlying of List[Int]) is unchecked since it is eliminated by erasure
case l: List[Int] => l
^
res2: List[Int] = List(1, a, 3)
scala> res2(1) // boom!
java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
at scala.runtime.BoxesRunTime.unboxToInt(BoxesRunTime.java:105)
... 33 elided
scala> import shapeless.syntax.typeable._
import shapeless.syntax.typeable._
scala> val as = a.flatMap {
| case x: Int => List(x)
| case xs => xs.cast[List[Int]].getOrElse(List())
| }
as: List[Int] = List(1, 2, 3, 4)
scala> val b = List(1, 2, List("a", "b"), 3)
b: List[Any] = List(1, 2, List(a, b), 3)
scala> val bs = b.flatMap {
| case x: Int => List(x)
| case xs => xs.cast[List[Int]].getOrElse(List())
| }
bs: List[Int] = List(1, 2, 3)