Avertissement: certaines parties de ces réponses sont des généralisations d'autres réponses trouvées ici.
Utiliser des lambdas sans spécifier leurs types d'arguments
Il est permis de soumettre quelque chose comme ceci: a=>a.size
au lieu de (a:String)=>a.size
.
Utilisez des symboles ascii comme identificateurs.
Cela comprend !%&/?+*~'-^<>|
. Parce qu'ils ne sont pas des lettres, ils sont séparés séparément lorsqu'ils sont à côté des lettres.
Exemples:
a=>b //ok
%=>% //error, parsed as one token
% => % //ok
val% =3 //ok
&contains+ //ok
if(x)&else* //ok
Utiliser Set au lieu de contient
if (Seq(1,2,3,'A')contains x)... //wrong
if (Set(1,2,3,'A')(x))... //right
C'est possible parce que Set[A] extends (A => Boolean)
.
Utilisez une fonction au curry lorsque vous avez besoin de deux arguments.
(a,b)=>... //wrong
a=>b=>... //right
Utilisez la _
syntaxe -si possible
Les règles pour cela sont quelque peu obscures, il faut parfois jouer un peu pour trouver le chemin le plus court.
a=>a.map(b=>b.size)) //wrong
a=>a.map(_.size) //better
_.map(_.size) //right
Utiliser une application partielle
a=>a+1 //wrong
_+1 //better, see above
1+ //right; this treats the method + of 1 as a function
Utiliser ""+
au lieu detoString
a=>a.toString //wrong
a=>a+"" //right
Utiliser des chaînes comme séquences
""
est parfois le moyen le plus court de créer une séquence vide si vous ne vous souciez pas du type d'actula
Utilisez BigInt pour convertir des nombres vers et depuis des chaînes
La méthode la plus courte pour convertir un nombre en chaîne dans une base autre que la base 10 est la toString(base: Int)
méthode BigInt
Integer.toString(n,b) //wrong
BigInt(n)toString b //right
Si vous souhaitez convertir une chaîne en nombre, utilisez BigInt.apply(s: String, base: Int)
Integer.parseInt(n,b) //wrong
BigInt(n,b) //right
Sachez que cela renvoie un BigInt, qui est utilisable comme un nombre la plupart du temps, mais ne peut pas être utilisé comme index pour une séquence, par exemple.
Utilisez Seq pour créer des séquences
a::b::Nil //wrong
List(...) //also wrong
Vector(...) //even more wrong
Seq(...) //right
Array(...) //also wrong, except if you need a mutable sequence
Utilisez des chaînes pour les séquences de caractères:
Seq('a','z') //wrong
"az" //right
Utilisez Stream pour des séquences infinies
Certains défis demandent le n-ième élément d'une séquence infinie. Stream est le candidat idéal pour cela. N'oubliez pas que Stream[A] extends (Int => A)
, c'est-à-dire, un flux est une fonction d'un index à l'élément de cet index.
Stream.iterate(start)(x=>calculateNextElement(x))
Utilisez des opérateurs symboliques au lieu de leurs homologues verbeux
:\
et :/
au lieu de foldRight
etfoldLeft
a.foldLeft(z)(f) //wrong
(z/:a)(f) //right
a.foldRight(z)(f) //wrong
(a:\z)(f) //right
hashCode
-> ##
throw new Error()
-> ???
Utilisez &
et |
au lieu de &&
et||
Ils fonctionnent de la même manière pour les booléens, mais évalueront toujours les deux opérandes
Alias méthode longue en tant que fonctions
def r(x:Double)=math.sqrt(x) //wrong
var r=math.sqrt _ //right; r is of type (Double=>Double)
Connaître les fonctions de la bibliothèque standard
Cela s'applique particulièrement aux méthodes de collecte.
Les méthodes très utiles sont:
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
par exemple, mais j'avoue que c'est bien celadef
et qu'ilsval
sont plus courts.def
est le mot clé pour définir une méthode, et une simple traduction en c ++ pourval
«const», et c'est une déclaration, mais le type est souvent déduit. Le raccourcissement est dans le premier cas letype=
plus prochetypedef
- n'est-ce pas? Le deuxième exemple ne vient pas de moi et c'est nouveau pour moi. Je dois faire attention, où l'utiliser.typedef long long ll;
est le même que#define ll long long
, donc celui-ci est plus court de 1. Mais oui,typedef
ça marche. En regardant àval
nouveau l' exemple, je l'ai certainement mal lu. Cela semble encore moins spécifique à Scala.x = thingWithAReallyLongComplicatedNameForNoReason
est une stratégie assez générale: PList
ouArray
etc avec une syntaxe,val x = List(1,2,3)
vous appelez simplement laapply
méthode sur l'List
objet. (Cette technique de création d'objet est connue sous le nom de "méthode d'usine", contrairement à l'utilisation d'un constructeur avecnew
.) Donc, ci-dessus, nous créons simplement une nouvelle variable qui pointe vers le même objet singleton que le nom de la variableArray
. Comme c'est la même chose, toutes les méthodes, y comprisapply
, sont disponibles.Utilisez la syntaxe infixe pour supprimer le besoin de
.
caractères. Vous n'avez pas besoin d'espaces sauf si les éléments adjacents sont à la fois en alphanumérique ou en caractères d'opérateur (voir ici ), et non séparés par des caractères réservés (crochets, virgules, etc.).Par exemple
la source
Les littéraux
true
etfalse
sont plus courts à écrire que2>1
pour le vrai et le1>2
fauxla source
Appelez deux fois la même fonction pour l'initialisation:
(Vu ailleurs, mais ne le trouve pas maintenant).
la source
Renommez les méthodes, si leur nom est long et si elles sont utilisées plusieurs fois - exemple réel:
En fonction de la possibilité d'enregistrer 'S = String' à différents endroits également, cela ne sera économique que si vous remplacez au moins replaceAll 3 fois.
la source
Initialisez plusieurs variables à la fois à l'aide d'un tuple:
contre.
la source
Vous pouvez également utiliser
⇒
au lieu d'utiliser=>
pour les définitions de fonction.la source