Scala:IndexOutOfBoundsException在映射时发生

时间:2013-11-29 12:25:49

标签: scala map

我在Windows下使用Scala 2.10.3和Java 1.7.0_45(64位) 在我的代码中

List.range(0, 10) map {ListBuffer[Int]()}

抛出java.lang.IndexOutOfBoundsException。但另一方面,

List.range(0, 10) map {i => ListBuffer[Int]()}

运作良好。

所以我想知道为什么会这样?两个表达式之间有什么区别吗?

2 个答案:

答案 0 :(得分:5)

ListBuffer[T]的apply方法查找给定索引处的元素。因此,您可以将ListBuffer[T]视为函数Int => T

val buf = ListBuffer[Int](1, 2, 3);
val f: Int => Int = buf
val i = f(1)    //i == 2

因此,您的第一个示例是向map传递一个函数,该函数在空列表缓冲区中的给定索引处查找元素,即它等效于

List.range(0, 10) map {i => ListBuffer[Int]()(i)}

因此例外。

答案 1 :(得分:3)

@Lee是对的,或者使用填充方法:

List.fill(10) {ListBuffer[Int]()}

这一行产生10个空的ListBuffers