72

Tôi bắt đầu khám phá Scala, và một trong những điều tôi tò mò là Optionloại và lời hứa có thể loại bỏ nullcác lỗi liên quan.

Tuy nhiên, tôi chưa thể tìm ra cách chuyển đổi một danh sách (hoặc bộ sưu tập khác) Option[String]thành một bộ sưu tập String(rõ ràng là lọc ra bất kỳ giá trị nào None).

Nói cách khác, làm thế nào để tôi có được điều này:

List[Option[Int]] = List(Some(1))

... đến đây:

List[Int] = List(1)

Tôi đang sử dụng Scala 2.8 nếu điều đó có bất kỳ tác động nào đến câu trả lời.

|
126
val list1 = List(Some(1), None, Some(2))
val list2 = list1.flatten // will be: List(1,2)
|
  • 1

    Mặc dù vậy, điều đáng lưu ý là nó chỉ hoạt động vì có một chuyển đổi ngầm định từ Tùy chọn [A] sang GenTraversableOnce [A]

    – Tạ Huy Lĩnh 07:20:17 15/04/2015
  • 1

    @kosii Hình như (ít nhất là trong Scala 2.11.6) chuyển đổi là từ Tùy chọn [A] sang Iterable [A]

    – Ngô Thu Ngọc 21:54:53 28/04/2015
53

Đối với mục đích giáo dục, bạn có thể thích một số lựa chọn thay thế:

scala> val list1 = List(Some(1), None, Some(2))
list1: List[Option[Int]] = List(Some(1), None, Some(2))

scala> list1 flatten
res0: List[Int] = List(1, 2)

// Expanded to show the implicit parameter
scala> list1.flatten(Option.option2Iterable)
res1: List[Int] = List(1, 2)

scala> list1 flatMap (x => x)
res2: List[Int] = List(1, 2)

scala> list1 flatMap Option.option2Iterable
res3: List[Int] = List(1, 2)

// collect is a simultaneous map + filter
scala> list1 collect { case Some(x) => x }
res4: List[Int] = List(1, 2)

Với Scalaz, bạn có thể thực hiện một thao tác hơi khác được gọi là sequencetrả về Option[List[Int]].

scala> import scalaz._; import Scalaz._
import scalaz._
import Scalaz._

scala> val list1: List[Option[Int]] = List(Some(1), None, Some(2)) 
list1: List[Option[Int]] = List(Some(1), None, Some(2))

scala> list1.sequence                                              
res1: Option[List[Int]] = None

scala> val list2: List[Option[Int]] = List(Some(1), Some(2))         
list2: List[Option[Int]] = List(Some(1), Some(2))

scala> list2.sequence
res2: Option[List[Int]] = Some(List(1, 2))
|

Câu trả lời của bạn (> 20 ký tự)

Bằng cách click "Đăng trả lời", bạn đồng ý với Điều khoản dịch vụ, Chính sách bảo mật and Chính sách cookie của chúng tôi.

Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ hoặc hỏi câu hỏi của bạn.