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.def
é a palavra-chave para definir um método, e uma tradução simples para c ++val
é 'const', e é uma declaração, mas o tipo geralmente é inferido. O encurtamento é, no primeiro caso, otype=
que está mais próximotypedef
- não é? O segundo exemplo não é meu e é novo para mim. Eu tenho que tomar cuidado, onde usá-lo.typedef long long ll;
é o mesmo que#define ll long long
, então o último é menor em 1. Mas sim,typedef
funciona. Olhando para oval
exemplo novamente, eu definitivamente o interpretei mal. Parece ainda menos específico do Scala.x = thingWithAReallyLongComplicatedNameForNoReason
é uma estratégia bastante geral: PList
ouArray
etc com sintaxe,val x = List(1,2,3)
está chamando oapply
método noList
objeto. (Essa técnica para criação de objetos é conhecida como "método de fábrica", em contraste com o uso de um construtornew
.) Portanto, acima, estamos apenas criando uma nova variável que aponta para o mesmo objeto singleton que o nome da variávelArray
. Como é a mesma coisa, todos os métodos, inclusiveapply
, estão disponíveis.Use a sintaxe infix para remover a necessidade de
.
caracteres. Você não precisa de espaços, a menos que os itens adjacentes estejam em caracteres alfanuméricos ou em caracteres de operador (veja aqui ) e não separados por caracteres reservados (colchetes, vírgulas etc.).Por exemplo
fonte
Os literais
true
efalse
são mais curtos para escrever como2>1
verdadeiro e1>2
falsofonte
Chame duas vezes a mesma função para inicialização:
(Visto em outro lugar, mas não é possível encontrá-lo agora).
fonte
Renomeie métodos, se o nome for longo e se forem usados várias vezes - exemplo do mundo real:
Dependendo da possibilidade de salvar 'S = String' também em locais diferentes, isso só será econômico se você substituir pelo menos replaceAll 3 vezes.
fonte
Inicialize várias variáveis de uma só vez usando uma tupla:
vs.
fonte
Você também pode usar em
⇒
vez de usar=>
para definições de função.fonte