获得斯卡拉列表中的项目?
在这个世界中,如何从scala中的List获得索引i中的元素?
我试图get(i)
和[i]
- 没有任何工作。 谷歌搜索只返回如何“找到”列表中的元素。 但是我已经知道元素的索引了!
以下是不能编译的代码:
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
(immutable)或者ArrayBuffer
(mutable)或者可能的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
无论何时您执行可能以此方式失败的操作,使用选项并获取类型系统以帮助确保处理元素不存在的情况是很好的。
说明:
这是可行的,因为List的apply
(糖仅仅是括号,例如l(index)
)就像是一个部分函数,它在列表中有一个元素的地方被定义。 List.lift
方法通过基本上将结果包装在一个选项中,将部分apply
函数(仅针对某些输入定义的函数)转换为正常函数(为任何输入定义)。
为什么括号?
这里是scala书籍编程的引用。
这个例子说明的另一个重要思想将让你深入了解为什么在Scala中使用圆括号访问数组。 Scala比Java更少特殊情况。 数组只是Scala中其他任何类的实例。 当您将一个或多个值的括号应用于变量时,Scala会将代码转换为对该变量名为apply的方法的调用。 所以greetStrings(i)变成了greetStrings.apply(i)。 因此,在Scala中访问数组的一个元素就像其他任何方法一样。 这个原则并不局限于数组:任何一个对象对圆括号中的某些参数的任何应用都会被转换为一个apply方法调用。 当然,只有当这种类型的对象实际上定义了一个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)
链接地址: http://www.djcxy.com/p/86193.html