在scala中,循环链接列表(scala.collection.mutable.LinkedList)的好方法是什么?例如,我想让'for'循环遍历链表上的每个对象并进行处理。
答案 0 :(得分: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
或者,如果您对每个对象的处理返回一个新值,请使用map:
scala> ll.map(_ * 2)
res3: scala.collection.mutable.LinkedList[Int] = LinkedList(2, 4, 6)
有些人更喜欢使用进行理解而不是foreach
和map
。它们看起来像这样:
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)
答案 1 :(得分:9)
扩展上一个答案...... for,foreach和map都是高阶函数 - 它们都可以作为参数使用函数,所以从这里开始:
val list = List(1,2,3)
list.foreach(i => println(i * 2))
您可以通过多种方式使代码在本质上更具说明性,同时更清晰。
首先,您实际上不需要使用名称 - i
- 对于集合的每个成员,您可以使用_
作为占位符:
list.foreach(println(_ * 2))
您还可以将逻辑分离为不同的方法,并继续使用占位符语法:
def printTimesTwo(i:Int) = println(i * 2)
list.foreach(printTimesTwo(_))
更干净,只需传递原始功能而不指定参数(看看ma,没有占位符!)
list.foreach(printTimesTwo)
为了得出合乎逻辑的结论,使用 infix 语法可以使其更加清晰。我在这里展示了使用标准库方法。 注意:如果需要,您甚至可以使用从java库导入的方法:
list foreach println
这种思维扩展到匿名函数和部分应用函数以及地图操作:
// "2 *" creates an anonymous function that will double its one-and-only argument
list map { 2 * }
在这个级别工作时,For-comprehension并不是非常有用,他们只是添加了样板。但是在使用更深层次的嵌套结构时,它们确实会自成一体:
//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
我不需要yield
关键字,因为没有返回任何内容。但是如果我想找回一个字符串列表(非嵌套):
for(line <- grid; cell <- line) yield { cell.toString }
有很多生成器,你需要将它们分成多行:
for {
listOfGrids <- someMasterCollection
grid <- listOfGrids
line <- grid
cell <- line
} yield {
cell.toString
}