Scala 中 Tuple 和 List[Any] 的区别?
Difference between Tuple and List[Any] in Scala?
目前,我正在学习 Scala 并阅读这本书 Programming in Scala,其中说:“与数组或列表不同,元组可以包含不同类型的对象。”例如,下面的元组包含 Int、String 和 Float。
val tup = (1, "hello", 4.4)
再说一次,书上说,"If you want to have any type of element in list/array, then you can use Any Datatype."
val list = List[Any](1, "hello", 4.4)
那么,以上这两种方法有什么区别呢?一个比另一个有什么好处?
tup
的类型为 (Int, String, Double)
,因此您可以使用正确的类型取回数据:tup._1
的类型为 Int
。 list
的类型为 List[Any]
,因此您丢失了所有类型信息:list(0)
的类型为 Any
。
除非万不得已,否则不要使用 Any
(或 List[Any]
等);当元组可以使用时,当然不要使用它。
元组是类型安全的,对于 List[Any],您必须将元素转换为适当的类型。
val tup = (1, "hello", 4.4)
tup._2 --> gives you string
val list = List[Any](1, "hello", 4.4)
list(1) --> gives you object of type Any and you have to cast this object
您的元组是 class 类型 Tuple3[Int, String, Double]。
Any
是一个 数据类型 ,就像 Int
或 String
,但与它们不同。
Tuple
是一个 容器 ,它可以容纳多种数据类型,即它可以包含不同数据类型的值,但是 Tuple
的类型将取决于Tuple
中有多少个元素,例如:
val tup = (1, "hello", 4.4) // type of tup here is scala.Tuple3 (Int, String, Double)
val tup = (2.3, null) // type of tup here is scala.Tuple2 (Double, Null)
val tup = (5:Any, "hello", 2.2) // type of tup here is scala.Tuple3 (Any, String, Double)
但是 Tuple
中每个元素的类型都将保持不变。另一方面,Any
就像一种本土数据类型,其中元素没有唯一的类型标识,最初是 String
或 Int
或 Null
类型, 将被转换为单一数据类型 Any
并将丢失所有类型信息。
更新:
Tuple
和 List[Any]
的区别在于 Tuple
可以容纳多种数据类型的元素,仍然保持单个元素的数据类型。
List
或 Array
只能包含 单一 数据类型的元素,因此 List[Any]
将包含 [=11] 类型的所有元素=] ,因此它基本上会将所有元素(无论其早期数据类型如何)转换为 Any
.
我不同意 PawelN
val list = List[Any](1, "hello", 4.4)
for (i <- list) println(i.getClass)
或
val array = Array[Any](1, "hello", 4.4)
for (i <- array) println(i.getClass)
结果:
class java.lang.Integer
class java.lang.String
class java.lang.Double
因此,当您访问列表或任意数组中的项目时,不需要转换。当然,我会怀疑使用这种东西的代码设计。
元组的要点是一个函数能够 return 任意数量的不同类型的对象。这比每次需要 return 多个值时创建 class 更轻,但会牺牲一些类型安全性。
目前,我正在学习 Scala 并阅读这本书 Programming in Scala,其中说:“与数组或列表不同,元组可以包含不同类型的对象。”例如,下面的元组包含 Int、String 和 Float。
val tup = (1, "hello", 4.4)
再说一次,书上说,"If you want to have any type of element in list/array, then you can use Any Datatype."
val list = List[Any](1, "hello", 4.4)
那么,以上这两种方法有什么区别呢?一个比另一个有什么好处?
tup
的类型为 (Int, String, Double)
,因此您可以使用正确的类型取回数据:tup._1
的类型为 Int
。 list
的类型为 List[Any]
,因此您丢失了所有类型信息:list(0)
的类型为 Any
。
除非万不得已,否则不要使用 Any
(或 List[Any]
等);当元组可以使用时,当然不要使用它。
元组是类型安全的,对于 List[Any],您必须将元素转换为适当的类型。
val tup = (1, "hello", 4.4)
tup._2 --> gives you string
val list = List[Any](1, "hello", 4.4)
list(1) --> gives you object of type Any and you have to cast this object
您的元组是 class 类型 Tuple3[Int, String, Double]。
Any
是一个 数据类型 ,就像 Int
或 String
,但与它们不同。
Tuple
是一个 容器 ,它可以容纳多种数据类型,即它可以包含不同数据类型的值,但是 Tuple
的类型将取决于Tuple
中有多少个元素,例如:
val tup = (1, "hello", 4.4) // type of tup here is scala.Tuple3 (Int, String, Double)
val tup = (2.3, null) // type of tup here is scala.Tuple2 (Double, Null)
val tup = (5:Any, "hello", 2.2) // type of tup here is scala.Tuple3 (Any, String, Double)
但是 Tuple
中每个元素的类型都将保持不变。另一方面,Any
就像一种本土数据类型,其中元素没有唯一的类型标识,最初是 String
或 Int
或 Null
类型, 将被转换为单一数据类型 Any
并将丢失所有类型信息。
更新:
Tuple
和 List[Any]
的区别在于 Tuple
可以容纳多种数据类型的元素,仍然保持单个元素的数据类型。
List
或 Array
只能包含 单一 数据类型的元素,因此 List[Any]
将包含 [=11] 类型的所有元素=] ,因此它基本上会将所有元素(无论其早期数据类型如何)转换为 Any
.
我不同意 PawelN
val list = List[Any](1, "hello", 4.4)
for (i <- list) println(i.getClass)
或
val array = Array[Any](1, "hello", 4.4)
for (i <- array) println(i.getClass)
结果:
class java.lang.Integer
class java.lang.String
class java.lang.Double
因此,当您访问列表或任意数组中的项目时,不需要转换。当然,我会怀疑使用这种东西的代码设计。
元组的要点是一个函数能够 return 任意数量的不同类型的对象。这比每次需要 return 多个值时创建 class 更轻,但会牺牲一些类型安全性。