如何将一个List[List[Long]]转换为List[List[Int]]?

3

如何在Scala中将List[List[Long]]转换为List[List[Int]]最好的方式是什么?

例如,给定以下类型为List[List[Long]]的列表:

val l: List[List[Long]] = List(List(11, 10, 11, 10, 11), List(8, 19, 24, 0, 2))

如何将其转换为List[List[Int]]

4个回答

6
你也可以使用cats库进行操作,并组合List函数子。
import cats.Functor
import cats.implicits._
import cats.data._

val l: List[List[Long]] = List(List(11, 10, 11, 10, 11), List(8, 19, 24, 0, 2))

Functor[List].compose[List].map(l)(_.toInt)
//or
Nested(l).map(_.toInt).value

还有一种纯Scala方法(虽然不太安全)

val res:List[List[Int]] = l.asInstanceOf[List[List[Int]]]

这两个看起来比被接受的答案更复杂。 - Tim
3
@Tim提出了“最好的方法”的问题(谁知道“最好的方法”是什么意思)。 - Bogdan Vakulenko
你问谁知道“最佳方式”是什么意思:奥卡姆剃刀原则是决定哪种解决方案更好的高度认可的原则。 - Tim
4
"better"是一个抽象的概念。其含义取决于具体的语境。 - Bogdan Vakulenko
@xin,你可能提到了不同的方法来实现这个...但是Bogdan-Vakulenko是正确的。下次请明确你所要求的内容。 - user3190018

5

尝试这样使用 l.map(_.map(_.toInt))

val l: List[List[Long]] = List(List(11, 10, 11, 10, 11), List(8, 19, 24, 0, 2))
l.map(_.map(_.toInt))

这应该会提供

res2: List[List[Int]] = List(List(11, 10, 11, 10, 11), List(8, 19, 24, 0, 2))

3

只有当你完全确定不会溢出Int时,才能这样做。

val l1: List[List[Long]] = List(List(11, 10, 11, 10, 11), List(8, 19, 24, 0, 2))
val l2: List[List[Int]] = l1.map(list => list.map(long => long.toInt))

基本上,每当你想要将一个列表转换为另一个列表时,请使用 map


1

可以使用简单的集合转换来实现,使用map函数即可。

map通过将函数应用于列表中的每个元素来工作。在您的情况下有嵌套列表。因此,您需要像以下示例一样两次应用map函数...

最初的回答:

使用map函数对集合进行简单的转换即可。

map函数通过对列表中的每个元素应用函数来实现。在你的情况下,存在嵌套列表。因此,你需要像下面的例子一样两次应用map函数...

val x : List[List[Long]] = List(List(11, 10, 11, 10, 11), List(8, 19, 24, 0, 2))   
println(x)

val y :List[List[Int]]= x.map(a => a.map(_.toInt))

println(y)

Output :

List(List(11, 10, 11, 10, 11), List(8, 19, 24, 0, 2))
List(List(11, 10, 11, 10, 11), List(8, 19, 24, 0, 2))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接