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.def
es la palabra clave para definir un método, y una traducción simple a c ++ paraval
es 'const', y es una declaración, pero a menudo se infiere el tipo. El acortamiento es en el primer caso eltype=
que está más cercatypedef
, ¿no es así? El segundo ejemplo no es mío y es nuevo para mí. Tengo que tener cuidado, dónde usarlo.typedef long long ll;
es lo mismo que#define ll long long
, por lo que este último es más corto en 1. Pero sí,typedef
funciona. Mirando elval
ejemplo nuevamente, definitivamente lo leí mal. Parece aún menos específico de Scala.x = thingWithAReallyLongComplicatedNameForNoReason
es una estrategia bastante general: PList
oArray
etc con sintaxisval x = List(1,2,3)
, solo está llamando alapply
método en elList
objeto. (Esta técnica para la creación de objetos se conoce como un "método de fábrica", en contraste con el uso de un constructor connew
). Así que arriba, solo estamos creando una nueva variable que apunta al mismo objeto singleton que el nombre de la variableArray
. Como es lo mismo, todos los métodos, incluidosapply
, están disponibles.Use la sintaxis infija para eliminar la necesidad de
.
caracteres. No necesita espacios a menos que los elementos adyacentes estén en caracteres alfanuméricos o en caracteres de operador (ver aquí ), y no estén separados por caracteres reservados (corchetes, comas, etc.).P.ej
fuente
Los literales
true
yfalse
son más cortos para escribir como2>1
verdadero y1>2
falsofuente
Llame dos veces la misma función para la inicialización:
(Visto en otro lugar, pero no puedo encontrarlo ahora).
fuente
Cambie el nombre de los métodos, si su nombre es largo y si se usan varias veces; ejemplo del mundo real:
Dependiendo de la posibilidad de guardar 'S = String' en diferentes lugares también, esto solo será económico, si reemplaza al menos 3 veces.
fuente
Inicialice varias variables a la vez usando una tupla:
vs.
fuente
También puede usar en
⇒
lugar de usar=>
para definiciones de funciones.fuente