سؤال

انا لدي Iterator[Option[T]] وأريد الحصول على Iterator[T] لأولئك Optionأين T isDefined.يجب أن تكون هناك طريقة أفضل من هذه:

it filter { _ isDefined} map { _ get }

كنت أعتقد أنه كان من الممكن في بناء واحد ...أي شخص أي أفكار؟

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

المحلول

في الحالة التي يكون فيها it هو Iterable

val it:Iterable[Option[T]] = ...
it.flatMap( x => x )                //returns an Iterable[T]

في الحالة التي يكون فيها it هو Iterator

val it:Iterator[Option[T]] = ...
it.flatMap( x => x elements )       //returns an Iterator[T]
it.flatMap( _ elements)             //equivalent

نصائح أخرى

في إصدارات أحدث هذا ممكن الآن:

val it: Iterator[Option[T]] = ...
val flatIt = it.flatten

هذا يناسبني (Scala 2.8):

it.collect {case Some(s) => s}

للي، وهذا هو حال استخدام الكلاسيكية لUI monadic.

for {
  opt <- iterable
  t   <- opt
} yield t

وانها مجرد السكر من أجل حل flatMap المذكورة أعلاه، وأنها تنتج بايت كود متطابقة. غير أن الأمور لغوي، وأعتقد أن واحدة من أفضل الأوقات لاستخدام بناء جملة for monadic سكالا هو عندما كنت تعمل مع Option، خصوصا بالتزامن مع المجموعات.

وأعتقد أن هذه الصيغة هي إلى حد كبير أكثر قابلية للقراءة، وخاصة لأولئك الذين لا دراية البرمجة الوظيفية. أنا غالبا ما تحاول كل من التعبيرات monadic والوظيفي للحلقة والتي ترى ويبدو أكثر وضوحا. وأعتقد أن <م> flatMap هو اسم من الصعب بالنسبة لمعظم الناس لجروك (وفعلا، واصفا إياه >>= المنطقي أكثر سهولة بالنسبة لي).

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