feragatname: bu cevapların bölümleri burada bulunan diğer cevapların genelleştirmeleridir.
Argüman türlerini belirtmeden lambda kullan
Bunun gibi bir şey göndermesine izin verilir: a=>a.size
bunun yerine (a:String)=>a.size
.
Tanımlayıcı olarak ascii sembollerini kullanın.
Bunlar arasında !%&/?+*~'-^<>|
. Harf olmadıkları için, harflerin yanındayken ayrıştırılırlar.
Örnekler:
a=>b //ok
%=>% //error, parsed as one token
% => % //ok
val% =3 //ok
&contains+ //ok
if(x)&else* //ok
Set yerine Set kullanın
if (Seq(1,2,3,'A')contains x)... //wrong
if (Set(1,2,3,'A')(x))... //right
Bu mümkün çünkü Set[A] extends (A => Boolean)
.
İki bağımsız değişkene ihtiyacınız olduğunda curried işlevi kullanın.
(a,b)=>... //wrong
a=>b=>... //right
_
Mümkünse -syntax kullanın
Bunun için kurallar biraz belirsizdir, bazen en kısa yolu bulmak için biraz oynamalısınız.
a=>a.map(b=>b.size)) //wrong
a=>a.map(_.size) //better
_.map(_.size) //right
Kısmi uygulama kullan
a=>a+1 //wrong
_+1 //better, see above
1+ //right; this treats the method + of 1 as a function
Yerine ""+
kullanıntoString
a=>a.toString //wrong
a=>a+"" //right
Dizileri dizi olarak kullanma
""
acula türünü umursamıyorsanız, bazen boş bir dizi oluşturmanın en kısa yoludur.
Numaraları dizgelere ve dizgelere dönüştürmek için BigInt kullanın.
Bir sayıyı 10 tabanından başka bir tabandaki dizgeye dönüştürmenin en kısa yolu BigInt toString(base: Int)
yöntemidir.
Integer.toString(n,b) //wrong
BigInt(n)toString b //right
Bir dizeyi sayıya dönüştürmek istiyorsanız, BigInt.apply(s: String, base: Int)
Integer.parseInt(n,b) //wrong
BigInt(n,b) //right
Bunun çoğu zaman bir sayı gibi kullanılabilen, ancak bir dizi için indeks olarak kullanılamayan bir BigInt döndürdüğünü unutmayın.
Dizileri oluşturmak için Sıra kullanın.
a::b::Nil //wrong
List(...) //also wrong
Vector(...) //even more wrong
Seq(...) //right
Array(...) //also wrong, except if you need a mutable sequence
Karakter dizileri için Strings kullanın:
Seq('a','z') //wrong
"az" //right
Sonsuz diziler için Stream kullanın
Bazı zorluklar sonsuz bir dizinin n. Elemanını ister. Akış bunun için mükemmel bir aday. Unutmayın Stream[A] extends (Int => A)
, akış bir dizinden o dizindeki öğeye kadar olan bir işlevdir.
Stream.iterate(start)(x=>calculateNextElement(x))
Wordy meslektaşları yerine sembolik operatörler kullanın.
:\
ve :/
yerine foldRight
vefoldLeft
a.foldLeft(z)(f) //wrong
(z/:a)(f) //right
a.foldRight(z)(f) //wrong
(a:\z)(f) //right
hashCode
-> ##
throw new Error()
-> ???
Kullanım &
ve |
yerine &&
ve||
Booleans için aynı şekilde çalışırlar, ancak her iki operand'ı da her zaman değerlendireceklerdir.
İşlev olarak takma uzun yöntem
def r(x:Double)=math.sqrt(x) //wrong
var r=math.sqrt _ //right; r is of type (Double=>Double)
Standart kütüphanedeki fonksiyonları bilir
Bu özellikle koleksiyon yöntemlerine uygulanır.
Çok faydalı yöntemler:
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
, örneğin C ++ için de geçerlidir , ancak bunun güzeldef
veval
daha kısa olduğunu kabul ediyorum .