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.size
alih-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 foldRight
danfoldLeft
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
#define
misalnya, tapi saya akui itu bagusdef
danval
lebih pendek.def
adalah kata kunci untuk mendefinisikan metode, dan terjemahan sederhana ke c ++ forval
adalah 'const', dan ini adalah deklarasi, tetapi jenisnya sering disimpulkan. Pemendekan dalam kasus pertamatype=
yang lebih dekattypedef
- bukan? Contoh kedua bukan dari saya dan ini baru bagi saya. Saya harus hati-hati, di mana menggunakannya.typedef long long ll;
sama dengan#define ll long long
, jadi yang terakhir lebih pendek dengan 1. Tapi ya,typedef
berhasil. Melihatval
contoh itu lagi saya pasti salah baca. Tampaknya bahkan kurang spesifik Scala.x = thingWithAReallyLongComplicatedNameForNoReason
adalah strategi yang cukup umum: PList
atauArray
dll dengan sintaksval x = List(1,2,3)
Anda hanya memanggilapply
metode padaList
objek. (Teknik untuk membuat objek ini dikenal sebagai "metode pabrik", berbeda dengan menggunakan konstruktor dengannew
.) Jadi di atas, kami hanya membuat variabel baru yang menunjuk ke objek tunggal yang sama dengan nama variabelArray
. Karena itu adalah hal yang sama, semua metode, termasukapply
, tersedia.Gunakan sintaks infix untuk menghapus kebutuhan
.
karakter. Anda tidak perlu spasi kecuali item yang berdekatan keduanya dalam alfanumerik atau keduanya dalam karakter operator (lihat di sini ), dan tidak dipisahkan oleh karakter yang dipesan (tanda kurung, koma dll).Misalnya
sumber
The
true
danfalse
literal yang lebih pendek untuk menulis sebagai2>1
untuk benar dan1>2
untuk palsusumber
Panggil dua kali fungsi yang sama untuk inisialisasi:
(Terlihat di tempat lain, tetapi tidak dapat menemukannya sekarang).
sumber
Ganti nama Metode, jika namanya panjang, dan jika digunakan berulang kali - contoh dunia nyata:
Tergantung pada kemungkinan untuk menyimpan 'S = String' di tempat yang berbeda juga, ini hanya akan ekonomis, jika Anda mengganti setidaknya ganti semua 3 kali.
sumber
Inisialisasi beberapa variabel sekaligus menggunakan tuple:
vs.
sumber
Anda juga dapat menggunakan
⇒
alih-alih menggunakan=>
untuk definisi fungsi.sumber