在Scala中,有两个操作可用于从其他List对象创建List:conc(:: :)和cons(::)
:::从输入列表中展平元素。
val fruits = List("Mango","Apple","Grapes");
val veggies = List("Potato","Brinjal","Jackfruit")
val conc = fruits:::veggies
conc是List(“Mango”,“Apple”,“Grapes”,“Potato”,“Brinjal”,“Jackfruit”)。由于原始列表是不可变的,这是不是意味着现在我们有重复的数据?
如果是::,会发生这种情况:
val fruits = List("Mango","Apple","Grapes");
val veggies = List("Potato","Brinjal","Jackfruit")
val cons = fruits::veggies
缺点是List(List(“Mango”,“Apple”,“Grapes”),“Potato”,“Brinjal”,“Jackfruit”)似乎缺点中的第一个元素仅仅是指水果,因此可以忽略不计重复。但是最后三个条目再次是蔬菜的主要重复。
在Scala中,有两个操作可用于从其他List对象创建List:conc(:: :)和cons(::)
只有第一个用于从List对象创建。缺点是从Objects创建。
由于Lists是对象本身,因此您可以将List作为元素放入另一个List中,但在几乎所有情况下,您都不希望这样做。
scala> val fruits = List("Mango","Apple","Grapes");
fruits: List[String] = List(Mango, Apple, Grapes)
scala> val veggies = List("Potato","Brinjal","Jackfruit")
veggies: List[String] = List(Potato, Brinjal, Jackfruit)
scala> val cons = fruits::veggies
cons: List[java.io.Serializable] = List(List(Mango, Apple, Grapes), Potato, Brinjal, Jackfruit)
请参阅第三个列表的类型如何变化:它是[java.ioSerializable]的列表,列表和字符串的第一个共同祖先,编译器找到。 cons.size是4,而不是6:水果列表作为第一元素和3个蔬菜。
由于原始列表是不可变的,这是不是意味着现在我们有重复的数据?
是(不)。
scala> val fruits = List ("Mango","Apple","Grapes");
fruits: List[String] = List(Mango, Apple, Grapes)
scala> val veggies = List ("Potato","Brinjal","Jackfruit")
veggies: List[String] = List(Potato, Brinjal, Jackfruit)
scala> val conc = fruits ::: veggies
conc: List[String] = List(Mango, Apple, Grapes, Potato, Brinjal, Jackfruit)
你得到了,你要求的东西,水果是不可改变的,所以你不能添加蔬菜,所以没有办法解决它。
似乎缺点的第一个要素仅仅是对水果的参考,因此可以忽略不计的重复。但最后三个条目再次是蔬菜的重复。
第一个元素是对fruits的第一个元素的引用,第二个元素是引用veggies的头部,因为两个列表都是不可变的。但水果的最后一个元素,指向Nil,不能改为指向蔬菜的头部,因为这会改变水果,这是禁止的。
但是,scala.collection.mutable中有可变列表,可以在适当的位置进行修改。
在许多情况下,您不需要担心内存问题。 3个列表,2个原始列表和组合主要是指向字符串的链接(它们不需要自己存储整个字符串,因为字符串也是不可变的),并且每个元素都有一个指向下一个元素的链接列表。