Por que parênteses?
Aqui está a citação da programação do livro em scala .
Outra idéia importante ilustrada por este exemplo fornecerá informações sobre por que as matrizes são acessadas com parênteses no Scala. Scala tem menos casos especiais que Java. Matrizes são simplesmente instâncias de classes como qualquer outra classe no Scala. Quando você aplica parênteses em torno de um ou mais valores a uma variável, o Scala transforma o código em uma invocação de um método denominado apply nessa variável. Então greetStrings (i) é transformado em greetStrings.apply (i). Assim, acessar um elemento de uma matriz no Scala é simplesmente uma chamada de método como qualquer outra. Esse princípio não se restringe a matrizes: qualquer aplicação de um objeto a alguns argumentos entre parênteses será transformada em uma chamada de método apply. Obviamente, isso será compilado apenas se esse tipo de objeto realmente definir um método de aplicação. Portanto, não é um caso especial; é uma regra geral.
Aqui estão alguns exemplos de como extrair determinado elemento (primeiro elem neste caso) usando o estilo de programação funcional.
// 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)