scala循环链接列表

Nul*_*x00 2 scala

在scala中,循环链接列表(scala.collection.mutable.LinkedList)的好方法是什么?例如,我想让'for'循环遍历链表上的每个对象并处理它.

Syn*_*sso 11

与foreach:

Welcome to Scala version 2.8.0.final (Java HotSpot(TM) Client VM, Java 1.6.0_21).
Type in expressions to have them evaluated.
Type :help for more information.

scala> val ll = scala.collection.mutable.LinkedList[Int](1,2,3)
ll: scala.collection.mutable.LinkedList[Int] = LinkedList(1, 2, 3)

scala> ll.foreach(i => println(i * 2))
2
4
6
Run Code Online (Sandbox Code Playgroud)

或者,如果您对每个对象的处理返回一个新值,请使用map:

scala> ll.map(_ * 2)                  
res3: scala.collection.mutable.LinkedList[Int] = LinkedList(2, 4, 6)
Run Code Online (Sandbox Code Playgroud)

有些人更喜欢理解而不是foreachmap.它们看起来像这样:

scala> for (i <- ll) println(i)
1
2
3

scala> for (i <- ll) yield i * 2
res5: scala.collection.mutable.LinkedList[Int] = LinkedList(2, 4, 6)
Run Code Online (Sandbox Code Playgroud)


Kev*_*ght 9

要扩展前面的答案... for,foreach和map都是高阶函数 - 它们都可以将函数作为参数,所以从这里开始:

val list = List(1,2,3)
list.foreach(i => println(i * 2))
Run Code Online (Sandbox Code Playgroud)

您可以通过多种方式使代码在本质上更具说明性,同时更清晰.

首先,您不需要使用名称 - i对于集合的每个成员,您可以将其_用作占位符:

list.foreach(println(_ * 2))
Run Code Online (Sandbox Code Playgroud)

您还可以将逻辑分离为不同的方法,并继续使用占位符语法:

def printTimesTwo(i:Int) = println(i * 2)
list.foreach(printTimesTwo(_))
Run Code Online (Sandbox Code Playgroud)

更简洁,只需传递原始函数而不指定参数(看看ma,没有占位符!)

list.foreach(printTimesTwo)
Run Code Online (Sandbox Code Playgroud)

并且为了得出合乎逻辑的结论,通过使用中语法可以使其更加清晰.我在这里展示了使用标准库方法.注意:如果您需要,甚至可以使用从java库导入的方法:

list foreach println
Run Code Online (Sandbox Code Playgroud)

这种思维扩展到匿名函数和部分应用函数以及映射操作:

// "2 *" creates an anonymous function that will double its one-and-only argument
list map { 2 * }
Run Code Online (Sandbox Code Playgroud)

在这个级别工作时,对于理解并不是非常有用,他们只是添加了样板.但是在使用更深层次的嵌套结构时,它们确实会自成一体:

//a list of lists, print out all the numbers
val grid = List(List(1, 2, 3), List(4, 5, 6), List(7, 8, 9))
grid foreach { _ foreach println } //hmm, could get confusing
for(line <- grid; cell <- line) println(cell) //that's clearer
Run Code Online (Sandbox Code Playgroud)

我不需要yield那里的关键字,因为没有返回任何内容.但是如果我想找回一个字符串列表(非嵌套):

for(line <- grid; cell <- line) yield { cell.toString }
Run Code Online (Sandbox Code Playgroud)

有了很多生成器,你需要将它们分成多行:

for {
  listOfGrids <- someMasterCollection
  grid <- listOfGrids
  line <- grid
  cell <- line
} yield {
  cell.toString
}
Run Code Online (Sandbox Code Playgroud)