scala يقوم بتحويل Iterator[Option[T]] إلى Iterator[T]
-
21-08-2019 - |
سؤال
انا لدي 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 م> هو اسم من الصعب بالنسبة لمعظم الناس لجروك (وفعلا، واصفا إياه >>=
المنطقي أكثر سهولة بالنسبة لي).