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.