disclaimer: parti di queste risposte sono generalizzazioni di altre risposte trovate qui.
Usa lambdas senza specificare i loro tipi di argomenti
È consentito inviare qualcosa del genere: a=>a.sizeanziché (a:String)=>a.size.
Usa simboli ASCII come identificatori.
Questi includono !%&/?+*~'-^<>|. Poiché non sono lettere, vengono analizzate separatamente quando si trovano accanto alle lettere.
Esempi:
a=>b //ok
%=>% //error, parsed as one token
% => % //ok
val% =3 //ok
&contains+ //ok
if(x)&else* //ok
Usa Set invece di contiene
if (Seq(1,2,3,'A')contains x)... //wrong
if (Set(1,2,3,'A')(x))... //right
Questo è possibile perché Set[A] extends (A => Boolean).
Utilizzare una funzione curry quando sono necessari due argomenti.
(a,b)=>... //wrong
a=>b=>... //right
Utilizzare la _sintassi quando possibile
Le regole per questo sono piuttosto oscure, devi giocare un po 'in giro a volte per trovare il modo più breve.
a=>a.map(b=>b.size)) //wrong
a=>a.map(_.size) //better
_.map(_.size) //right
Usa un'applicazione parziale
a=>a+1 //wrong
_+1 //better, see above
1+ //right; this treats the method + of 1 as a function
Usa ""+invece ditoString
a=>a.toString //wrong
a=>a+"" //right
Usa le stringhe come sequenze
"" a volte è il modo più breve per creare una sequenza vuota se non ti interessa il tipo di actula
Usa BigInt per convertire numeri da e verso stringhe
Il modo più breve per convertire un numero in una stringa in una base diversa dalla base 10 è tramite il toString(base: Int)metodo di BigInt
Integer.toString(n,b) //wrong
BigInt(n)toString b //right
Se vuoi convertire una stringa in un numero, usa BigInt.apply(s: String, base: Int)
Integer.parseInt(n,b) //wrong
BigInt(n,b) //right
Tieni presente che questo restituisce un BigInt, che è utilizzabile come un numero il più delle volte, ma non può essere utilizzato come indice per una sequenza, ad esempio.
Usa Seq per creare sequenze
a::b::Nil //wrong
List(...) //also wrong
Vector(...) //even more wrong
Seq(...) //right
Array(...) //also wrong, except if you need a mutable sequence
Usa stringhe per sequenze di caratteri:
Seq('a','z') //wrong
"az" //right
Utilizza Stream per sequenze infinite
Alcune sfide richiedono l'ennesimo elemento di una sequenza infinita. Stream è il candidato perfetto per questo. Ricorda che Stream[A] extends (Int => A), cioè, uno stream è una funzione da un indice all'elemento in quell'indice.
Stream.iterate(start)(x=>calculateNextElement(x))
Usa operatori simbolici invece delle loro controparti prolifiche
:\e :/invece di foldRightefoldLeft
a.foldLeft(z)(f) //wrong
(z/:a)(f) //right
a.foldRight(z)(f) //wrong
(a:\z)(f) //right
hashCode -> ##
throw new Error() -> ???
Usa &e |invece di &&e||
Funzionano allo stesso modo per i booleani, ma valuteranno sempre entrambi gli operandi
Alias metodo lungo come funzioni
def r(x:Double)=math.sqrt(x) //wrong
var r=math.sqrt _ //right; r is of type (Double=>Double)
Conoscere le funzioni nella libreria standard
Ciò vale soprattutto per i metodi di raccolta.
Metodi molto utili sono:
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
#definead esempio, ma ammetto che è carinodefevalsono più brevi.