سؤال

ما هو الفرق بين map و flatMap وظائف Iterable?

هل كانت مفيدة؟

المحلول

وهنا هو تفسير جيد جدا:

HTTP: // شبكة الاتصالات العالمية. codecommit.com/blog/scala/scala-collections-for-the-easily-bored-part-2

والقائمة عن طريق كمثال:

وتوقيع خريطة هو:

map [B](f : (A) => B) : List[B]

ووفي flatMap هو

flatMap [B](f : (A) => Iterable[B]) : List[B]

وهكذا flatMap يأخذ نوع [A] وإرجاع نوع iterable [B] وخريطة يأخذ نوع [A] وإرجاع نوع [B]

وهذا سيعطي لك أيضا فكرة أن flatmap سوف "تسطيح" القوائم.

val l  = List(List(1,2,3), List(2,3,4))

println(l.map(_.toString)) // changes type from list to string
// prints List(List(1, 2, 3), List(2, 3, 4))

println(l.flatMap(x => x)) // "changes" type list to iterable
// prints List(1, 2, 3, 2, 3, 4)

نصائح أخرى

وقبل كل شيء صحيح، ولكن هناك أكثر من الشيء الذي هو في متناول يدي: flatMap يتحول List[Option[A]] إلى List[A]، مع أي Option أن التدريبات وصولا الى None، إزالتها. هذا هو طفرة المفاهيمي أساسيا للحصول على ما وراء استخدام null.

من scaladoc:

  • خريطة

ترجع iterable الناتجة من تطبيق معين الدالة f كل عنصر من هذه iterable.

  • flatMap

ينطبق وظيفة معينة و إلى كل عنصر من هذه iterable ، ثم يسلسل النتائج.

lines.map(line => line split "\\W+") // will return a list of arrays of words
lines.flatMap(line => line split "\\W+") // will return a list of words

ويمكنك ان ترى هذا أفضل في لcomprehensions:

for {line <- lines
     word <- line split "\\W+"}
yield word.length

وهذا يترجم إلى:

lines.flatMap(line => line.split("\\W+").map(word => word.length))

وسوف تترجم كل مكرر داخل لفي "flatMap"، باستثناء واحد آخر، والذي يحصل على ترجمتها إلى "الخريطة". بهذه الطريقة، بدلا من العودة المجموعات المتداخلة (قائمة مجموعة من مخزن مؤقت كذا وكذا وكذا)، يمكنك إرجاع مجموعة مسطح. مجموعة تتكون من العناصر التي yield'ed - قائمة الأعداد الصحيحة، في هذه الحالة

وانظر هنا: HTTP: //www.codecommit. كوم / بلوق / سكالا / سكالا-مجموعات مقابل و-يسهل بالملل-الجزء 2

و"البحث عن flatMap" - هناك تفسير جيد حقا هناك. (أساسا بل هو مزيج من "تسطيح" و "الخريطة" - ملامح من لغات أخرى).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top