在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)
有些人更喜欢理解而不是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)
Run Code Online (Sandbox Code Playgroud)
要扩展前面的答案... 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)
| 归档时间: |
|
| 查看次数: |
7938 次 |
| 最近记录: |