scala उन्हें पहले मानचित्रण किए बिना संग्रह तत्वों के फ़ील्ड्स को योग कैसे करें(जैसे foldLeft/lowLeft)?




collections sum (2)

लाइब्रेरी में विधि sum इस तरह से काम नहीं करता है, लेकिन आप अपना खुद भी लिख सकते हैं:

def mySum[T, Res](f: T => Res, seq: TraversableOnce[T])(implicit num: Numeric[Res]) = 
  seq.foldLeft(num.zero)((acc, b) => num.plus(acc, f(b)))

आप एक अंतर्निहित रूपांतरण भी जोड़ सकते हैं ताकि आप इसे mySum(f, seq) बजाय seq.sum(f) जैसे कॉल कर सकते हैं (आप संघर्ष से बचने के लिए sum से भिन्न नाम की आवश्यकता हो सकती है):

case class SumTraversableOnce[T](val seq: TraversableOnce[T]) { 
  def sum[Res](f: T => Res)(implicit num: Numeric[Res]) = mySum(f, seq)(num) 
}

implicit def toSumTraversableOnce[T](seq: TraversableOnce[T]) = 
  SumTraversableOnce(seq)

या, स्कला 2.10 के बाद से,

implicit class SumTraversableOnce[T](val seq: TraversableOnce[T]) { 
  def sum[Res](f: T => Res)(implicit num: Numeric[Res]) = mySum(f, seq)(num) 
}

इस वर्ग पर विचार करें:

 case class Person(val firstName: String, val lastName: String, age: Int)
 val persons = Person("Jane", "Doe", 42) :: Person("John", "Doe", 45) :: 
               Person("Joe", "Doe", 43) :: Person("Doug", "Don", 65) :: 
               Person("Darius", "Don", 24) :: Person("Dora", "Don", 20) :: 
               Person("Dane", "Dons", 29) :: Nil

सभी व्यक्तियों की आयु का योग प्राप्त करने के लिए, मैं कोड लिख सकता हूँ:

persons.foldLeft(0)(_ + _.age)

लेकिन अगर मैं sum का उपयोग करना चाहता हूं, तो मुझे पहले मान को मानचित्रित करना होगा और कोड इस तरह दिखता है:

persons.map(_.age).sum

कुछ मध्यवर्ती संग्रह बनाने के बिना मैं sum विधि का उपयोग कैसे कर सकता हूं?

(मुझे पता है कि इस तरह के "ऑप्टिमाइज़ेशन" में तंग लूप में नहीं चलने पर शायद कोई वास्तविक प्रदर्शन अंतर नहीं होता है और मैं आलसी विचारों के बारे में भी जानता हूं।)

क्या ऐसा कोड होना संभव है

persons.sum(_.age)

क्या foldLeft कर रही है foldLeft / reduceLeft क्या होता है?


आपने उत्तर दिया खुद है बस view उपयोग करें:

persons.view.map(_.age).sum

वर्कफ़्लो की जांच करके स्वयं को मनाने के लिए:

persons.view.map { p =>
  println("invoking age")
  p.age
}.map { x =>
  println("modifing age")
  x + 0
}.sum

बनाम:

persons.map { p =>
  println("invoking age")
  p.age
}.map { x =>
  println("modifing age")
  x + 0
}.sum




higher-order-functions