isenção de responsabilidade: partes dessas respostas são generalizações de outras respostas encontradas aqui.
Use lambdas sem especificar seus tipos de argumento
É permitido enviar algo como isto: em a=>a.size
vez de (a:String)=>a.size
.
Use símbolos ASCII como identificadores.
Estes incluem !%&/?+*~'-^<>|
. Como não são letras, são analisados separadamente quando estão ao lado de letras.
Exemplos:
a=>b //ok
%=>% //error, parsed as one token
% => % //ok
val% =3 //ok
&contains+ //ok
if(x)&else* //ok
Use Set em vez de contém
if (Seq(1,2,3,'A')contains x)... //wrong
if (Set(1,2,3,'A')(x))... //right
Isso é possível porque Set[A] extends (A => Boolean)
.
Use uma função ao curry quando precisar de dois argumentos.
(a,b)=>... //wrong
a=>b=>... //right
Use a _
sintaxe-quando possível
As regras para isso são um tanto obscuras, às vezes é preciso brincar um pouco para encontrar o caminho mais curto.
a=>a.map(b=>b.size)) //wrong
a=>a.map(_.size) //better
_.map(_.size) //right
Use aplicação parcial
a=>a+1 //wrong
_+1 //better, see above
1+ //right; this treats the method + of 1 as a function
Use em ""+
vez detoString
a=>a.toString //wrong
a=>a+"" //right
Use strings como sequências
""
Às vezes, é a maneira mais curta de criar uma sequência vazia se você não se importa com o tipo de actula
Use o BigInt para converter números de e para strings
A maneira mais curta de converter um número em uma string em uma base diferente da base 10 é através do toString(base: Int)
método do BigInt
Integer.toString(n,b) //wrong
BigInt(n)toString b //right
Se você deseja converter uma string em um número, use BigInt.apply(s: String, base: Int)
Integer.parseInt(n,b) //wrong
BigInt(n,b) //right
Esteja ciente de que isso retorna um BigInt, que pode ser usado como um número na maioria das vezes, mas não pode ser usado como um índice para uma sequência, por exemplo.
Use Seq para criar sequências
a::b::Nil //wrong
List(...) //also wrong
Vector(...) //even more wrong
Seq(...) //right
Array(...) //also wrong, except if you need a mutable sequence
Use seqüências de caracteres para seqüências de caracteres:
Seq('a','z') //wrong
"az" //right
Faça uso do Stream para infinitas sequências
Alguns desafios pedem o n-ésimo elemento de uma sequência infinita. Stream é o candidato perfeito para isso. Lembre-se de que Stream[A] extends (Int => A)
, isto é, um fluxo é uma função de um índice para o elemento nesse índice.
Stream.iterate(start)(x=>calculateNextElement(x))
Use operadores simbólicos em vez de suas contrapartes prolixo
:\
e em :/
vez de foldRight
efoldLeft
a.foldLeft(z)(f) //wrong
(z/:a)(f) //right
a.foldRight(z)(f) //wrong
(a:\z)(f) //right
hashCode
-> ##
throw new Error()
-> ???
Use &
e em |
vez de &&
e||
Eles funcionam da mesma forma para booleanos, mas sempre avaliarão ambos os operandos
Alias long method como funções
def r(x:Double)=math.sqrt(x) //wrong
var r=math.sqrt _ //right; r is of type (Double=>Double)
Conheça as funções na biblioteca padrão
Isso se aplica especialmente aos métodos de coleções.
Métodos muito úteis são:
map
flatMap
filter
:/ and :\ (folds)
scanLeft and scanRight
sliding
grouped (only for iterators)
inits
headOption
drop and take
collect
find
zip
zipWithIndex3
distinct and/or toSet
startsWith
#define
por exemplo, mas admito que seja bomdef
e queval
seja mais curto.