click below
click below
Normal Size Small Size show me how
Scala Programming
Few snippets of Scala programming language written in Portuguese.
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 |