วิธีการกรองไม่มีรายการ [ตัวเลือก]?


106

ถ้าฉันมีList[Option[A]]ใน Scala มีสำนวนอย่างไรในการกรองNoneค่าออกไป

วิธีหนึ่งคือใช้สิ่งต่อไปนี้:

val someList: List[Option[String]] = List(Some("Hello"), None, Some("Goodbye"))
someList.filter(_ != None)

มีวิธี "สำนวน" มากกว่านี้ไหม? ดูเหมือนจะค่อนข้างง่าย


1
ที่เกี่ยวข้อง: stackoverflow.com/questions/4730842/…
dskrvk

คำตอบ:


162

หากคุณต้องการกำจัดตัวเลือกในเวลาเดียวกันคุณสามารถใช้flatten:

scala> someList.flatten
res0: List[String] = List(Hello, Goodbye)

23
ฉันจะเพิ่มที่flatMapสามารถใช้ในการประมวลผลองค์ประกอบรายการอื่นที่ไม่ใช่Nones คล้ายกับsomeList.flatten.mapที่มักต้องการทำงานกับองค์ประกอบเหล่านี้ไม่ใช่แค่flattenรายการที่สนุก
Frank

ใช่ฉันลังเลที่จะถาม Raph ว่าเขาคาดหวังว่าจะทำอะไรกับรายการที่กรองแล้ว แต่ยังมีอีกหลายสถานการณ์ที่คุณต้องการทำให้แบนราบ
Nicolas

บางครั้งฉันต้องการที่จะดึงเนื้อหาของOptionวัตถุ แต่ครั้งอื่น ๆ Option[A]ที่ฉันต้องการพวกเขาจะยังคงเป็น ฉันกำลังค้นหาการใช้งานมากขึ้นสำหรับOption[A]- คุณลักษณะที่ยอดเยี่ยม
Ralph

มีวิธีการประเภท flatForeach ที่เทียบเท่าหรือไม่?
cdmckay

1
หากคอลเลกชันของคุณไม่เปลี่ยนรูป faltmap จะทำเคล็ดลับ หากคอลเลกชันของคุณไม่แน่นอนไม่มีก็ไม่ได้
Nicolas


2

catsห้องสมุดนอกจากนี้ยังมีflattenOptionซึ่งจะเปลี่ยนใด ๆF[Option[A]]ลงไปF[A](ที่F[_]เป็นFunctorFilter)

import cats.implicits._

List(Some(1), Some(2), None).flattenOption == List(1, 2)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.