डिस्क्लेमर: इस उत्तर के भाग यहां पाए गए अन्य उत्तरों के सामान्यीकरण हैं।
अपने तर्क प्रकारों को निर्दिष्ट किए बिना लैम्ब्डा का उपयोग करें
इसे कुछ इस तरह प्रस्तुत करने की अनुमति है: a=>a.size
इसके बजाय (a:String)=>a.size
।
पहचानकर्ता के रूप में एएससीआई-प्रतीकों का उपयोग करें।
इनमें शामिल हैं !%&/?+*~'-^<>|
। क्योंकि वे अक्षर नहीं हैं, वे पत्र के बगल में रहने पर पार्स हो जाते हैं।
उदाहरण:
a=>b //ok
%=>% //error, parsed as one token
% => % //ok
val% =3 //ok
&contains+ //ok
if(x)&else* //ok
सेट के बजाय उपयोग करें
if (Seq(1,2,3,'A')contains x)... //wrong
if (Set(1,2,3,'A')(x))... //right
ऐसा संभव है Set[A] extends (A => Boolean)
।
जब आपको दो तर्कों की आवश्यकता हो, तो एक करीने वाले फ़ंक्शन का उपयोग करें।
(a,b)=>... //wrong
a=>b=>... //right
_
जब संभव हो तब -syntax का उपयोग करें
इसके लिए नियम कुछ हद तक अस्पष्ट हैं, आपको सबसे छोटा रास्ता खोजने के लिए कभी-कभी थोड़ा सा खेलना होगा।
a=>a.map(b=>b.size)) //wrong
a=>a.map(_.size) //better
_.map(_.size) //right
आंशिक अनुप्रयोग का उपयोग करें
a=>a+1 //wrong
_+1 //better, see above
1+ //right; this treats the method + of 1 as a function
के ""+
बजाय का उपयोग करेंtoString
a=>a.toString //wrong
a=>a+"" //right
क्रम के रूप में तार का उपयोग करें
""
यदि आप एक्टुला प्रकार की परवाह नहीं करते हैं, तो कभी-कभी एक खाली अनुक्रम बनाने का सबसे छोटा तरीका है
संख्याओं को स्ट्रिंग से और में बदलने के लिए BigInt का उपयोग करें
बेस 10 के अलावा अन्य संख्या को आधार में स्ट्रिंग में बदलने का सबसे छोटा तरीका बिगआईंट की toString(base: Int)
विधि है
Integer.toString(n,b) //wrong
BigInt(n)toString b //right
यदि आप किसी स्ट्रिंग को संख्या में बदलना चाहते हैं, तो उपयोग करें BigInt.apply(s: String, base: Int)
Integer.parseInt(n,b) //wrong
BigInt(n,b) //right
विदित हो कि यह एक BigInt लौटाता है, जो कई बार एक नंबर की तरह प्रयोग करने योग्य होता है, लेकिन उदाहरण के लिए एक अनुक्रम के रूप में इसका उपयोग नहीं किया जा सकता है।
अनुक्रम बनाने के लिए Seq का उपयोग करें
a::b::Nil //wrong
List(...) //also wrong
Vector(...) //even more wrong
Seq(...) //right
Array(...) //also wrong, except if you need a mutable sequence
वर्णों के अनुक्रम के लिए स्ट्रिंग्स का उपयोग करें:
Seq('a','z') //wrong
"az" //right
अनंत दृश्यों के लिए स्ट्रीम का उपयोग करें
कुछ चुनौतियाँ अनंत अनुक्रम के n-वें तत्व के लिए पूछती हैं। इसके लिए स्ट्रीम सही उम्मीदवार है। याद रखें Stream[A] extends (Int => A)
, कि, एक सूचकांक उस सूचकांक पर तत्व से एक फ़ंक्शन है।
Stream.iterate(start)(x=>calculateNextElement(x))
अपने चिंताजनक समकक्षों के बजाय प्रतीकात्मक ऑपरेटरों का उपयोग करें
:\
और के :/
बजाय foldRight
औरfoldLeft
a.foldLeft(z)(f) //wrong
(z/:a)(f) //right
a.foldRight(z)(f) //wrong
(a:\z)(f) //right
hashCode
-> ##
throw new Error()
-> ???
का प्रयोग करें &
और |
के बजाय &&
और||
वे बूलियन के लिए समान काम करते हैं, लेकिन हमेशा दोनों ऑपरेंड का मूल्यांकन करेंगे
कार्यों के रूप में एलियास लंबी विधि
def r(x:Double)=math.sqrt(x) //wrong
var r=math.sqrt _ //right; r is of type (Double=>Double)
मानक पुस्तकालय में कार्यों को जानें
यह विशेष रूप से संग्रह के तरीकों पर लागू होता है।
बहुत उपयोगी तरीके हैं:
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
उदाहरण के लिए C ++ के साथ भी लागू होता है , लेकिन मैं मानता हूं कि यह अच्छा हैdef
औरval
छोटे हैं।