descargo de responsabilidad: partes de estas respuestas son generalizaciones de otras respuestas que se encuentran aquí.
Use lambdas sin especificar sus tipos de argumento
Está permitido enviar algo como esto: en a=>a.size
lugar de (a:String)=>a.size
.
Use símbolos ascii como identificadores.
Estos incluyen !%&/?+*~'-^<>|
. Como no son letras, se analizan por separado cuando están al lado de las letras.
Ejemplos:
a=>b //ok
%=>% //error, parsed as one token
% => % //ok
val% =3 //ok
&contains+ //ok
if(x)&else* //ok
Use Set en lugar de contiene
if (Seq(1,2,3,'A')contains x)... //wrong
if (Set(1,2,3,'A')(x))... //right
Esto es posible porque Set[A] extends (A => Boolean)
.
Use una función curry cuando necesite dos argumentos.
(a,b)=>... //wrong
a=>b=>... //right
Use la _
sintaxis cuando sea posible
Las reglas para esto son algo oscuras, a veces hay que jugar un poco para encontrar el camino más corto.
a=>a.map(b=>b.size)) //wrong
a=>a.map(_.size) //better
_.map(_.size) //right
Usar aplicación parcial
a=>a+1 //wrong
_+1 //better, see above
1+ //right; this treats the method + of 1 as a function
Usar en ""+
lugar detoString
a=>a.toString //wrong
a=>a+"" //right
Usa cadenas como secuencias
""
a veces es la forma más corta de crear una secuencia vacía si no te importa el tipo de actula
Use BigInt para convertir números hacia y desde cadenas
La forma más corta de convertir un número a una cadena en una base que no sea la base 10 es a través del toString(base: Int)
método de BigInt
Integer.toString(n,b) //wrong
BigInt(n)toString b //right
Si desea convertir una cadena en un número, use BigInt.apply(s: String, base: Int)
Integer.parseInt(n,b) //wrong
BigInt(n,b) //right
Tenga en cuenta que esto devuelve un BigInt, que se puede usar como un número la mayoría de las veces, pero no se puede usar como índice para una secuencia, por ejemplo.
Usa Seq para crear secuencias
a::b::Nil //wrong
List(...) //also wrong
Vector(...) //even more wrong
Seq(...) //right
Array(...) //also wrong, except if you need a mutable sequence
Utilice cadenas para secuencias de caracteres:
Seq('a','z') //wrong
"az" //right
Utiliza Stream para secuencias infinitas
Algunos desafíos requieren el enésimo elemento de una secuencia infinita. Stream es el candidato perfecto para esto. Recuerde que Stream[A] extends (Int => A)
, es decir, una secuencia es una función de un índice al elemento en ese índice.
Stream.iterate(start)(x=>calculateNextElement(x))
Use operadores simbólicos en lugar de sus homólogos verbales
:\
y en :/
lugar de foldRight
yfoldLeft
a.foldLeft(z)(f) //wrong
(z/:a)(f) //right
a.foldRight(z)(f) //wrong
(a:\z)(f) //right
hashCode
-> ##
throw new Error()
-> ???
Use &
y en |
lugar de &&
y||
Funcionan igual para los booleanos, pero siempre evaluarán ambos operandos
Método largo alias como funciones
def r(x:Double)=math.sqrt(x) //wrong
var r=math.sqrt _ //right; r is of type (Double=>Double)
Conozca las funciones en la biblioteca estándar.
Esto se aplica especialmente a los métodos de colecciones.
Los métodos muy útiles son:
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 ejemplo, pero admito que es buenodef
yval
son más cortos.