获取Scala列表中的项目?
在世界上你是如何从Scala的List中得到索引i的元素的?
我试图get(i)
和[i]
– 没有任何工作。 谷歌search只返回如何“find”列表中的元素。 但是我已经知道元素的索引了!
这是不能编译的代码:
def buildTree(data: List[Data2D]):Node ={ if(data.length == 1){ var point:Data2D = data[0] //Nope - does not work } return null }
看着列表api没有帮助,因为我的眼睛只是交叉。
使用括号:
data(2)
但是你并不想经常使用这个列表,因为链表需要时间来遍历。 如果你想索引到一个集合,使用Vector
(不可变)或ArrayBuffer
(可变)或可能的Array
(这只是一个Java数组,除了再次用(i)
而不是[i]
索引到它)。
更安全的是使用lift
所以你可以提取值,如果它存在,并失败优雅,如果没有。
data.lift(2)
如果列表的长度不足以提供该元素,则返回None,如果是,则返回Some(value)。
scala> val l = List("a", "b", "c") scala> l.lift(1) Some("b") scala> l.lift(5) None
每当你执行一个可能以这种方式失败的操作时,最好使用一个Option并获取types系统来帮助确保你正在处理的元素不存在的情况下。
说明:
这是可行的,因为List的apply
(哪些糖仅仅是括号,例如l(index)
)就像是一个部分函数,它在列表中有一个元素的地方被定义。 List.lift
方法通过基本上将结果包装到一个Option中,将部分apply
函数(一个仅为某些input定义的函数)转换为一个正常函数(对于任何input定义)。
为什么括号?
这里是scala书籍编程的引用。
这个例子说明的另一个重要的想法将让你深入了解为什么在Scala中用圆括号访问数组。 与Java相比,Scala的特殊情况更less。 数组只是Scala中其他任何类的实例。 当您将一个或多个值的括号应用于variables时,Scala会将代码转换为对该variables名为apply的方法的调用。 所以greetStrings(i)被转换成了greetStrings.apply(i)。 因此,在Scala中访问一个数组的元素只是一个像其他任何方法调用。 这个原则并不局限于数组:任何一个对象对圆括号中的某些参数的任何应用都将被转换为一个apply方法调用。 当然,只有当这种types的对象实际上定义了一个apply方法时才会编译。 所以这不是特例。 这是一个普遍的规则。
下面是一些例子,如何使用函数式编程风格来拉动某些元素(在这种情况下是第一个元素)。
// Create a multdimension Array scala> val a = Array.ofDim[String](2, 3) a: Array[Array[String]] = Array(Array(null, null, null), Array(null, null, null)) scala> a(0) = Array("1","2","3") scala> a(1) = Array("4", "5", "6") scala> a Array[Array[String]] = Array(Array(1, 2, 3), Array(4, 5, 6))
// 1. paratheses scala> a.map(_(0)) Array[String] = Array(1, 4) // 2. apply scala> a.map(_.apply(0)) Array[String] = Array(1, 4) // 3. function literal scala> a.map(a => a(0)) Array[String] = Array(1, 4) // 4. lift scala> a.map(_.lift(0)) Array[Option[String]] = Array(Some(1), Some(4)) // 5. head or last scala> a.map(_.head) Array[String] = Array(1, 4)