Penafian: bagian dari jawaban ini adalah generalisasi dari jawaban lain yang ditemukan di sini.
Gunakan lambdas tanpa menentukan jenis argumen mereka
Diizinkan mengirim sesuatu seperti ini: a=>a.sizealih-alih (a:String)=>a.size.
Gunakan simbol ascii sebagai pengidentifikasi.
Ini termasuk !%&/?+*~'-^<>| . Karena mereka bukan huruf, mereka diurai terpisah ketika mereka di sebelah huruf.
Contoh:
a=>b //ok
%=>% //error, parsed as one token
% => % //ok
val% =3 //ok
&contains+ //ok
if(x)&else* //ok
Gunakan Set bukannya berisi
if (Seq(1,2,3,'A')contains x)... //wrong
if (Set(1,2,3,'A')(x))... //right
Ini dimungkinkan karena Set[A] extends (A => Boolean).
Gunakan fungsi kari ketika Anda membutuhkan dua argumen.
(a,b)=>... //wrong
a=>b=>... //right
Gunakan _-syntax jika memungkinkan
Aturan untuk ini agak tidak jelas, Anda harus bermain sedikit kadang-kadang untuk menemukan cara terpendek.
a=>a.map(b=>b.size)) //wrong
a=>a.map(_.size) //better
_.map(_.size) //right
Gunakan aplikasi sebagian
a=>a+1 //wrong
_+1 //better, see above
1+ //right; this treats the method + of 1 as a function
Gunakan ""+sebagai gantitoString
a=>a.toString //wrong
a=>a+"" //right
Gunakan string sebagai urutan
"" terkadang merupakan cara terpendek untuk membuat urutan kosong jika Anda tidak peduli dengan jenis actula
Gunakan BigInt untuk mengonversi angka ke dan dari string
Cara terpendek untuk mengonversi angka menjadi string di basis selain basis 10 adalah melalui toString(base: Int)metode BigInt
Integer.toString(n,b) //wrong
BigInt(n)toString b //right
Jika Anda ingin mengonversi string ke angka, gunakan BigInt.apply(s: String, base: Int)
Integer.parseInt(n,b) //wrong
BigInt(n,b) //right
Perlu diketahui bahwa ini mengembalikan BigInt, yang bisa digunakan seperti angka sebagian besar kali, tetapi tidak dapat digunakan sebagai indeks untuk urutan, misalnya.
Gunakan Seq untuk membuat urutan
a::b::Nil //wrong
List(...) //also wrong
Vector(...) //even more wrong
Seq(...) //right
Array(...) //also wrong, except if you need a mutable sequence
Gunakan Strings untuk Seqences of chars:
Seq('a','z') //wrong
"az" //right
Manfaatkan Stream untuk urutan yang tak terbatas
Beberapa tantangan meminta elemen ke-n dari urutan yang tak terbatas. Stream adalah kandidat yang sempurna untuk ini. Ingat bahwa Stream[A] extends (Int => A), yaitu, aliran adalah fungsi dari indeks ke elemen di indeks itu.
Stream.iterate(start)(x=>calculateNextElement(x))
Gunakan operator simbolik alih-alih rekan bertele-tele mereka
:\dan :/bukannya foldRightdanfoldLeft
a.foldLeft(z)(f) //wrong
(z/:a)(f) //right
a.foldRight(z)(f) //wrong
(a:\z)(f) //right
hashCode -> ##
throw new Error() -> ???
Gunakan &dan |bukannya &&dan||
Mereka bekerja sama untuk boolean, tetapi akan selalu mengevaluasi kedua operan
Metode panjang alias sebagai fungsi
def r(x:Double)=math.sqrt(x) //wrong
var r=math.sqrt _ //right; r is of type (Double=>Double)
Ketahui fungsi-fungsi di perpustakaan standar
Ini khususnya berlaku untuk metode pengumpulan.
Metode yang sangat berguna adalah:
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
#definemisalnya, tapi saya akui itu bagusdefdanvallebih pendek.