| Conceito | Código |
| Determinando o tamanho de uma string em Scala. | val s = "Hello, world"
<br><br>
s.length // 12 |
| Percorrendo e imprimindo elementos de uma coleção - Uso de estruturas de repetição. | val a = Array("apple", "banana", "orange")
<br><br>
for (e <- a) println(e) |
| Aplicando uma propriedade a todos os elementos de uma lista - Usando funções anônimas (funções literais). | val x = List.range(1, 10)
<br><br>
val evens = x.filter((i: Int) => i % 2 == 0)
<br><br>
evens: List[Int] = List(2, 4, 6, 8) |
| Criando listas longas em Scala sem causar erros de acesso à memória - Uso de um Stream para criar listas "preguiçosas". | Para listas com o número de elementos indefinido, o uso de Streams é aconselhado:<br><br>
val stream = (1 to 100000000).toStream<br><br>
stream: scala.collection.immutable.Stream[Int] = Stream(1, ?) |
| Determinando o fatorial de um número sem criar muitas chamadas de função e uso de memória - Definição de um método com recursão de calda. | def factorial(i: BigInt): BigInt = {<br><br>
def fact(i: BigInt, accumulator: BigInt): BigInt = i match {<br><br>
case _ if i == 1 => accumulator<br><br>
case _ => fact(i - 1, i * accumulator) }<br><br>
fact(i, 1) }<br><br> |
| Usando um Stream para obter números maiores que 200 em uma sequência com 300 elementos - Uso do método filter de um Stream. | val stream = (1 to 300).toStream<br><br>
stream.filter(_ > 200) |
| Usando um Iterator para excluir strings que são menores que 2 caracteres - usando o método dropWhile de um Iterator | val it = Iterator("a", "number", "of", "words")<br><br>
it dropWhile (_.length < 2)<br><br>
it.next()
java.lang.String = number<br><br> |
| Realizar operações sobre objetos de determinados tipos - Case Classes in Match Expressions. | def determineType(x: Animal): String = x match {
case Dog(moniker) => "Got a Dog, name = " + moniker
case _:Cat => "Got a Cat (ignoring the name)"
case Woodpecker => "That was a Woodpecker"
case _ => "That was something else"
} |
| Definindo uma função que retorna uma função e ainda permite chamadas para obter um resultado - Currying. | def add(x:Int)(y:Int) = x + y |
| Declarando o tipo de variáveis enquanto escreve o código - Tipagem estática. | var num: Int = 10 |
| Escrevendo valores literais e assumindo seu tipo - Inferência de tipos | val a = 1<br>
a: Int = 1<br> |
| Passando parâmetros que não serão avaliados enquanto não forem chamados - Passagem de parâmetros por nome e avaliação tardia | def myCallByNameFunction(callByNameParameter: => ReturnType) |
| Grupos de dois ou mais valores, geralmente criados com valores literais - Tuplas | val t = ("Hello",1,2.3)<br><br>
(java.lang.String, Int, Double) = (Hello,1,2.3) |
| Estruturas que recebem mensagens e atuam quando se trata de concorrência e threading em Scala - Actors | val fussyActor = actor { loop {<br><br>
receive {<br><br>
case s: String => println("I got a String: " + s)<br><br>
case i: Int => println("I got an Int: " + i.toString)<br><br>
case _ => println("I have no idea what I just got.")<br><br>
} }<br>
} |
| Propriedade de Actors que salva todas as mensagens recebidas - Mailbox | val countActor = actor {<br><br>
loop {<br>
react {<br>
case "how many?" => {<br><br>
println("I've got " + mailboxSize.toString + " messages in my mailbox.")
}<br>
} }<br>
} |
| Estrutura que agrupa dados na forma de chave->valor dentro do paradigma funcional - Maps | val stateCapitals = Map( "Alabama" -> "Montgomery","Alaska" -> "Juneau") |
| Métodos que podem parecer operadores - Métodos podem contem vários tipos de caracteres especiais. | val stream = 1 #:: 2 #:: 3 #:: Stream.empty |
| Estruturas simulares às interfaces em Java, Traits são poderosos porque podem ser implementados de acordo com a necessidade. Nem todos os métodos são obrigatórios. | trait Similarity {<br>
def isSimilar(x: Any): Boolean<br><br>
def isNotSimilar(x: Any): Boolean = !isSimilar(x)<br><br>
}<br>
class Point(xc: Int, yc: Int) extends Similarity {<br><br>
(...)<br>
def isSimilar(obj: Any) = (...)<br><br>
} |
| Estruturas que são como enums do Java, mas possuem sintaxe diferente (e também são tratadas assim a nível de bytes) - Enumerations | object Breed extends Enumeration {<br><br>
val doberman = Value("Doberman Pinscher")<br><br>
val yorkie = Value("Yorkshire Terrier")<br><br>
(...)<br>
}
for (breed <- Breed) println(breed.id + "\t" + breed)<br><br>
0 Doberman Pinscher<br>
(...) |
| Pacote que pode converter (implicitamente) valores que vieram de Java para valores em Scala - JavaConversions. | var list = new java.util.ArrayList[Int]()<br><br>
list.add(1)<br>
list.add(2)<br>
list.foreach(println)<br>
(...) foreach not a member of java.util.ArrayList[Int]<br><br>
import scala.collection.JavaConversions._<br><br>
list.foreach(println)
1
2 |