Làm cách nào để lọc Không có gì ra khỏi Danh sách [Tùy chọn]?


105

Nếu tôi có List[Option[A]]trong Scala, cách thành ngữ để lọc ra các Nonegiá trị là gì?

Một cách là sử dụng như sau:

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

Có cách nào "thành ngữ" hơn không? Điều này có vẻ khá đơn giản.


Câu trả lời:


161

Nếu bạn muốn loại bỏ các tùy chọn cùng một lúc, bạn có thể sử dụng flatten:

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

23
Tôi sẽ thêm nó flatMapcó thể được sử dụng để xử lý các phần tử danh sách khác với Nones, tương tự như someList.flatten.map, vì người ta thường muốn làm việc với các phần tử này chứ không chỉ flattendanh sách cho vui.
Frank

Vâng, tôi đã do dự khi hỏi Raph rằng anh ấy sẽ làm gì với danh sách đã lọc. Nhưng cũng có rất nhiều kịch bản mà bạn chỉ muốn san bằng.
Nicolas

Đôi khi tôi muốn truy xuất nội dung của các Optionđối tượng, nhưng những lần khác tôi cần chúng giữ nguyên như vậy Option[A]. Tôi ngày càng tìm thấy nhiều cách sử dụng cho Option[A]- tính năng thú vị.
Ralph

Có phương pháp loại flatForeach tương đương không?
cdmckay

1
Nếu bộ sưu tập của bạn là bất biến, faltmap sẽ thực hiện thủ thuật. Nếu bộ sưu tập của bạn có thể thay đổi, không, không có.
Nicolas

18

someList.filter(_.isDefined) nếu bạn muốn giữ loại kết quả là List[Option[A]]


2

Các catsthư viện cũng có flattenOption, mà biến bất kỳ F[Option[A]]thành F[A](trong đó F[_]là một FunctorFilter)

import cats.implicits._

List(Some(1), Some(2), None).flattenOption == List(1, 2)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.