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.def
ist das Schlüsselwort zum Definieren einer Methode, und eine einfache Übersetzung in c ++ fürval
lautet 'const', und es ist eine Deklaration, aber der Typ wird oft abgeleitet. Die Verkürzung ist im ersten Fall die,type=
die näher isttypedef
- nicht wahr? Das zweite Beispiel ist nicht von mir und es ist neu für mich. Ich muss aufpassen, wo ich es verwenden soll.typedef long long ll;
ist das gleiche wie#define ll long long
, also ist letzteres um 1 kürzer. Aber ja,typedef
funktioniert. Wennval
ich das Beispiel noch einmal anschaue, habe ich es definitiv falsch verstanden. Es scheint noch weniger Scala-spezifisch.x = thingWithAReallyLongComplicatedNameForNoReason
ist eine ziemlich allgemeine Strategie: PList
oderArray
etc mit Syntax instanziieren,val x = List(1,2,3)
rufen Sie nur dieapply
Methode für dasList
Objekt auf. (Diese Technik zur Objekterstellung wird im Gegensatz zur Verwendung eines Konstruktors mit als "Factory-Methode" bezeichnetnew
.) Daher erstellen wir oben nur eine neue Variable, die auf dasselbe Singleton-Objekt verweist wie der VariablennameArray
. Da es dasselbe ist, stehen alle Methoden, einschließlichapply
, zur Verfügung.Verwenden Sie die Infix-Syntax, um
.
Zeichen zu vermeiden . Sie brauchen keine Leerzeichen, es sei denn, benachbarte Elemente sind beide alphanumerisch oder beide in Operatorzeichen (siehe hier ) und nicht durch reservierte Zeichen (Klammern, Kommas usw.) getrennt.Z.B
quelle
Die
true
undfalse
Literale sind kürzer zu schreiben als2>1
für wahr und1>2
für falschquelle
Rufen Sie zur Initialisierung zweimal dieselbe Funktion auf:
(Woanders gesehen, kann es aber jetzt nicht finden).
quelle
Methoden umbenennen, wenn ihr Name lang ist und wenn sie mehrfach verwendet werden - Beispiel aus der Praxis:
Abhängig von der Möglichkeit, 'S = String' auch an verschiedenen Stellen zu speichern, ist dies nur dann wirtschaftlich, wenn Sie mindestens 3-mal 'replaceAll' verwenden.
quelle
Initialisieren Sie mehrere Variablen gleichzeitig mit einem Tupel:
gegen
quelle
Sie können auch
⇒
anstelle von=>
für Funktionsdefinitionen verwenden.quelle