展平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)