Haftungsausschluss: Teile dieser Antworten sind Verallgemeinerungen anderer Antworten, die hier zu finden sind.
Verwenden Sie Lambdas, ohne deren Argumenttypen anzugeben
Es ist erlaubt so etwas einzureichen: a=>a.size
statt (a:String)=>a.size
.
Verwenden Sie ASCII-Symbole als Bezeichner.
Dazu gehören !%&/?+*~'-^<>|
. Da sie keine Buchstaben sind, werden sie getrennt analysiert, wenn sie sich neben Buchstaben befinden.
Beispiele:
a=>b //ok
%=>% //error, parsed as one token
% => % //ok
val% =3 //ok
&contains+ //ok
if(x)&else* //ok
Set anstelle von contain verwenden
if (Seq(1,2,3,'A')contains x)... //wrong
if (Set(1,2,3,'A')(x))... //right
Das ist möglich, weil Set[A] extends (A => Boolean)
.
Verwenden Sie eine Curry-Funktion, wenn Sie zwei Argumente benötigen.
(a,b)=>... //wrong
a=>b=>... //right
Verwenden _
Sie nach Möglichkeit die Syntax -syntax
Die Regeln dafür sind etwas unklar, man muss manchmal ein bisschen herumspielen, um den kürzesten Weg zu finden.
a=>a.map(b=>b.size)) //wrong
a=>a.map(_.size) //better
_.map(_.size) //right
Teilweise anwenden
a=>a+1 //wrong
_+1 //better, see above
1+ //right; this treats the method + of 1 as a function
Verwenden Sie ""+
anstelle vontoString
a=>a.toString //wrong
a=>a+"" //right
Verwenden Sie Zeichenfolgen als Sequenzen
""
Dies ist manchmal der kürzeste Weg, eine leere Sequenz zu erstellen, wenn Sie sich nicht für den Actula-Typ interessieren
Verwenden Sie BigInt, um Zahlen in und aus Zeichenfolgen zu konvertieren
Der kürzeste Weg, eine Zahl in eine Zeichenfolge in einer anderen Basis als Basis 10 umzuwandeln, ist die toString(base: Int)
Methode von BigInt
Integer.toString(n,b) //wrong
BigInt(n)toString b //right
Wenn Sie eine Zeichenfolge in eine Zahl konvertieren möchten, verwenden Sie BigInt.apply(s: String, base: Int)
Integer.parseInt(n,b) //wrong
BigInt(n,b) //right
Beachten Sie, dass dies ein BigInt zurückgibt, das die meiste Zeit wie eine Zahl verwendet werden kann, aber beispielsweise nicht als Index für eine Sequenz verwendet werden kann.
Verwenden Sie Seq, um Sequenzen zu erstellen
a::b::Nil //wrong
List(...) //also wrong
Vector(...) //even more wrong
Seq(...) //right
Array(...) //also wrong, except if you need a mutable sequence
Verwenden Sie Zeichenfolgen für Zeichenfolgen:
Seq('a','z') //wrong
"az" //right
Nutzen Sie Stream für unendliche Sequenzen
Einige Herausforderungen verlangen das n-te Element einer unendlichen Folge. Stream ist dafür der perfekte Kandidat. Denken Sie daran Stream[A] extends (Int => A)
, dass ein Stream eine Funktion von einem Index zu dem Element an diesem Index ist.
Stream.iterate(start)(x=>calculateNextElement(x))
Verwenden Sie symbolische Operatoren anstelle ihrer wortreichen Gegenstücke
:\
und :/
anstelle von foldRight
undfoldLeft
a.foldLeft(z)(f) //wrong
(z/:a)(f) //right
a.foldRight(z)(f) //wrong
(a:\z)(f) //right
hashCode
-> ##
throw new Error()
-> ???
Verwenden Sie &
und |
anstelle von &&
und||
Sie funktionieren für Boolesche Werte gleich, werten jedoch immer beide Operanden aus
Alias lange Methode als Funktionen
def r(x:Double)=math.sqrt(x) //wrong
var r=math.sqrt _ //right; r is of type (Double=>Double)
Kennen Sie die Funktionen in der Standardbibliothek
Dies gilt insbesondere für die Methoden der Sammlung.
Sehr nützliche Methoden sind:
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
für C ++ , aber ich gebe zu, dass es schön istdef
undval
kürzer ist.